MySQL for OPS 01:簡介 / 安裝初始化 / 用戶授權管理


寫在前面的話

 

取這個標題的目的很簡單,MySQL 在中小型企業中一般都是由運維來維護的,除非數據很重要的公司可能會聘請 DBA。

但是運維一般存在由於所需要了解的東西很多很雜,導致學習過程中很多東西只能淺嘗輒止。就像 MySQL,為此專門做這樣一個系列,系統的捋一捋 MySQL。

 

 

關於數據庫

 

什么是數據?

我們在瀏覽一個網站的時候,如愛奇藝,可以看到首頁有很多視頻,圖片,文字,這些都是數據。

用比較官方的話來說就是:對客觀事件進行記錄並可以鑒別的符號。

 

什么是數據庫?

就是存放這些數據文件的地方,可以對它的數據進行增刪改查。

 

關系型數據庫管理系統(RDBMS)用途:

一般用於保存對於數據的安全性要求較高的數據。常見如:MySQL,Oracle,SQL Server,PostgreSQL

 

非關系型數據庫(NoSQL)用途:
一般用於對於性能要求高,但是對於數據安全性沒那么高的數據。常見如:鍵值的 Redis,Memcache,文檔的 MongoDB

 

可以簡單的了解一下 MySQL 的發展:

MySQL 一開始是作為一個開源項目誕生的,在此之前很多傳統企業(國家機關)還是以 Oracle 為主。這幾年互聯網行業風生水起,導致 MySQL 占有的市場份額不斷增加,已經嚴重威脅到了 Oracle 的地位,這肯定是 Oracle 這個公司不能接受的。所以以 Oracle 的尿性,干不贏你就收購你。至此,MySQL 分成了社區版(Community)商業版(Enterprise)。但這並不影響我們的使用,我們選擇社區版。

當然,在這整個變遷過程中,MySQL 團隊的成員出來以后也重寫了項目,於是就有了兩個重要的分支:PerconaDB(Percona) MariaDB(紅帽)

這兩個分支在市面上也占有非常大的份額,但是我們並不用擔心學哪個,因為使用方法幾乎和 MySQL 一模一樣。

 

關於 MySQL 版本的一些知識:

MySQL 5.5:很早期的版本,除非實在換不下來,否則這個幾乎已是歷史,當然還在更新。以 5.5.20 版本為例,發行於 2011 年。

MySQL 5.6:可能很多公司還會有,但大多為老項目,以 5.6.20 版本為例,更新於 2014 年。

MySQL 5.7:現在主流版本,相比於 5.6 有一些很好的優化,所以 5.7 是生產主力版本,5.7.20 於 2017 年更新。

MySQL 8:全新版本,據了解改動不小。目前處於嘗鮮體驗階段。2018 年開始發力更新。

 

對於數據庫這種東西來說,並非越新越好,所以嘗鮮踩雷交給別人,我們選擇 5.7 GA 穩定發布版

本文選擇二進制安裝,至於編譯安裝可能后面有時間會補上,甚至以 Percona 為例。

另外,MySQL 其實很多定制化的東西都可以寫到配置文件中,所以二進制安裝足夠了。

官網下載(認死了官網):

https://downloads.mysql.com/archives/community/

如圖所示:

 

最后,關於其它數據庫目前的使用情況也可以簡單了解:

https://db-engines.com/en/ranking

結果如下:

 

 

二進制安裝

 

目錄設計如下:

說明:

1. 設計將所有文件都存放到 /data 目錄下。

2. packages/mysql 存放二進制包,logs/mysql 存放日志 / PID / sock 文件,services/mysql 主程序,backup/mysql 存放備份,data/mysql 存放數據。

3. 將下載的 mysql-5.7.25-linux-glibc2.12-x86_64.tar.gz 上傳到服務器的 /data/packages/mysql 下面。

 

開始安裝:

1. 新建目錄和用戶:

mkdir -p /data/{data,logs,backup,packages}/mysql
mkdir -p /data/services
useradd -s /sbin/nologin mysql

 

2. 修改權限:

chown mysql.mysql /data/logs/mysql/
chown mysql.mysql /data/data/mysql/

 

3. 解壓二進制包:

cd /data/packages/mysql/
tar -zxf mysql-5.7.25-linux-glibc2.12-x86_64.tar.gz -C /data/services/
cd /data/services/
mv mysql-5.7.25-linux-glibc2.12-x86_64/ mysql

 

4. 添加環境變量:

echo 'export PATH=$PATH:/data/services/mysql/bin' >> /etc/profile
source /etc/profile

 

5. 測試命令:

mysql -V

結果如下:

至此,安裝就完成,值得注意的是:

1. 之前創建的目錄需要為空,否則后面初始化可能報錯。

2. 如果已經安裝了其它 MySQL,建議先卸載,否則初始化可能報錯。

 

 

初始配置數據庫

 

安裝完成后,MySQL 默認是沒有數據的,需要初始化:

1. 初始化數據庫:

mysqld --initialize-insecure --user=mysql --datadir=/data/data/mysql --basedir=/data/services/mysql

初始化完成 MySQL 管理員用戶默認沒有密碼:

這源於初始化參數:--initialize-insecure,如果只是 --initialize ,會默認生成一個 12 位復雜度非常高的密碼。

在初始化過程中,指定了程序用戶,程序目錄,以及數據保存的目錄。可以去 /data/data/mysql 中查看生成的數據:

如果初始化失敗,刪除該目錄下所有文件,重新初始化。

而在 5.6 版本中,初始化命令還是:mysql_install_db

 

2. 配置默認配置文件:/etc/my.cnf

[mysqld]
user=mysql
port=3306
basedir=/data/services/mysql
datadir=/data/data/mysql
pid-file=/data/logs/mysql/mysqld.pid
log-error=/data/logs/mysql/error.log
socket=/data/logs/mysql/mysql.sock
server_id=111

[client]
port=3306
socket=/data/logs/mysql/mysql.sock
prompt=3306/\\u [\\d]>

 

3. 配置啟動文件並啟動服務:

# 添加配置文件
cd /data/services/mysql/support-files/
cp mysql.server /etc/init.d/mysqld

# 手動創建日志和 PID 文件
touch /data/logs/mysql/error.log
touch /data/logs/mysql/mysqld.pid
chown -R mysql.mysql /data/logs/mysql/

# 啟動服務
/etc/init.d/mysqld start

結果如下:

此時 MySQL 運行為兩個進程:

一個以 root 用戶運行,一個以 MySQL 用戶運行。

 

4. 登錄數據庫:

mysql

沒有設置密碼,所有可以直接登錄:

由於在配置文件中指定了登錄后提示顯示,所以可以直接看到端口,use 的庫。相比默認的顯示友好很多。

 

5. CentOS 7 systemd 配置:/etc/systemd/system/mysqld.service

[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target

[Install]
WantedBy=multi-user.target

[Service]
User=mysql
Group=mysql
ExecStart=/data/services/mysql/bin/mysqld --defaults-file=/etc/my.cnf
LimitNOFILE = 5000

測試啟動:

systemctl start mysqld

查看進程:

發現使用 systemd 運行 MySQL 只有一個進程。

 

 

關於 MySQL 服務

 

MySQL 安裝完成以后,對於服務的構成,通常能夠看到這樣一個圖:

 

工作流程:

1. 應用程序通過連接層傳送 SQL 到 SQL 層,此時 SQL 層會對該 SQL 進行語法校驗和是否滿足當前 MySQL 定義的 sql_mode。

說明:連接 MySQL 的方式一般有兩種,一種是 TCP/IP,一種是 Socket。

2. SQL 層還會對 SQL 類型進行判斷,檢查用戶對庫的權限,解析 SQL 生成多種執行方案並擇優選擇執行。

說明:SQL 語句類型包含數據庫定義語言(DDL),數據庫控制語言(DCL),數據庫操作語言(DML),數據查詢語言(DQL)

3. 存儲引擎層負責存取數據。

 

數據庫的邏輯結構如下圖:

其中需要記住的主要關鍵字:庫,表,字段,字段類型,記錄

 

數據庫的物理存儲結構如下圖:

現在的數據庫存儲引擎一般都是 InnoDB,庫對應着服務器上面 /data/data/mysql 下的目錄。可以新建目錄測試:

# 創建目錄
mkdir -p /data/data/mysql/abc

# 登錄數據庫查看
mysql

結果如下:

 

刪庫跑路命令:刪庫一時爽,一直刪庫一直爽

drop database abc;

查看:

 

 

用戶管理

 

由於 insecure 的原因,mysql 的 root 用戶沒有密碼。這顯然是不安全的,在實際工作中,雖然 MySQL 數據庫服務器雖然一般在生產內網,但為了安全起見,還是會給數據庫進行加密,授權操作。

1. 創建用戶:

# 創建用戶
create user 'dylan'@'%' identified by '123';

# 查看用戶
select user,host,authentication_string from mysql.user;

創建 dylan 用戶,密碼 123,% 授權所有都能登錄。

完成之后去系統的 mysql 庫的 user 表查看用戶的用戶名,允許登錄授權,密碼。

可以發現,用戶的密碼是加密的,當然,在老版本中,authentication_string 的字段名可能是 password。

至於授權,可以參考下表:

授權 說明
'dylan'@'%' 允許所有,能通信的就能登錄
'dylan'@'192.168.10.%' 允許 192.168.10.1 - 254 登錄
'dylan'@'192.168.10.1%' 值允許 192.168.10.1 / 10 - 19 登錄
'dylan'@'192.168.10.1' 只允許 192.168.10.1 登錄
'dylan'@'127.0.0.1' 只允許本機登錄
'dylan'@'localhost' 只允許本機登錄
'dylan'@'app01' 允許能解析的主機名 app01 登錄
'dylan'@'192.168.10.0/255.255.255.0' 允許網段登錄

這大概就是所有授權方式,已經能夠完全滿足日常使用。

 

2. 修改用戶:

# 給沒有密碼的 root 用戶設置密碼
alter user 'root'@'localhost' identified by '456';

此時再度查看:

 

3. 刪除用戶:

# 刪除用戶
drop user 'dylan'@'%';

結果如下:

 

 

權限管理

 

在日常工作中,除了管理員自身,一般不會拿着 root 用戶直接開始使用,所有會新建一個專門的應用用戶。

但在某些時候,如果只是想給某個用戶一個只讀權限,這就牽扯到了 MySQL 權限授予。

在 MySQL 一般權限有如下一些:

select,insert, update, delete, create, drop, reload, shutdown, process, file, references, index, alter, show databases, super, create temporary tables, lock tables, execute, replication slave, replication client, create view, show view, create routine, alter routine, create user, event, trigger, create tablespace

 

比如給一個用戶授權 abc 庫增刪查改的權限:在授權的同時順便將之前刪除的用戶重新創建。

# 創建數據庫
create database abc;

# 創建並授權用戶
grant insert,delete,select,update on abc.* to 'dylan'@'%' identified by '123';

 

如果用戶需要 abc 庫的所有權限,那么不需要一個一個的寫,直接用 all:

grant all on abc.* to 'dylanall'@'%' identified by '123';

 

對於授權方式一般用:

*.*:授權所有庫

abc.*:授權 abc 庫下面的所有表

abc.t1:授權 abc 下面的 t1 表

 

當然,如果想一個普通用戶變成管理員用戶,需要兩樣授權,一個是 all,一個是 with grant option

grant all on *.* to 'admin'@'%' identified by '123' with grant option;

這樣 admin 用戶就能像 root 用戶一樣了。

簡單的擴展一下:

在 8.0 以前的版本,可以在授權的同時新建用戶和設置密碼,但是在 8.0 以后的版本,建用戶和授權必須分開。

 

授權完成,查看用戶的授權:

show grants for 'dylan'@'%';

結果如圖:

 

當然也可以收回授予用戶的某個權限:

revoke delete on abc.* from 'dylan'@'%';

查看結果:

 

 

忘記密碼重置密碼

 

人到中年從忘記密碼開始,雖然會將密碼保存到一定的文檔里面,但是一切總有意外。當這些意外發生的時候,如何挽救。

# 停止 MySQL
systemctl stop mysqld

# 跳過驗證啟動 MySQL,並限定只是本地跳過
mysqld_safe --skip-grant-tables --skip-networking &

# 登錄數據庫
mysql

這里跳過了驗證,同時跳過了網絡,意味着只能本地 socket 連接,此時 3306 端口其實是沒有啟動的。

使用 mysqld_safe,本身啟動 MySQL 實質就是通過這個文件。此時連上數據庫重置密碼:

值得注意的是,在修改用戶密碼之前,需要 flush privileges 刷新一下,否則無法重置。

原因是本身是跳過認證的,你在修改認證,MySQL 覺得你是憨憨,所以需要刷新將配置加載。

重置完成退出登錄,重啟 MySQL:

# 停止 MySQL
pkill mysqld

# 重新啟動
systemctl start mysqld

此時就可以使用新密碼登錄!

當然,這種方法有些暴力,可以換溫柔一點的方法,在 /etc/my.cnf 中加入 skip-grant-tables ,重啟數據庫,然后登錄修改,修改完成后去掉配置重啟數據庫即可。

 

 

連接數據庫

 

在連接數據庫的時候,可以看到之前在命令行連接都是直接帶個 -u -p 參數。

前面說過 MySQL 連接的兩種方式 TCP 和 Socket,Socket 怎么使用呢?

mysql -uroot -p -S /data/logs/mysql/mysql.sock

這種一般用於有多個實例的時候,-S 指定 sock當然,還有一些其它參數。

 

使用 -P 指定端口,使用  -h 指定數據庫 IP 地址,用於在其它主機上連接。

mysql -uroot -p -P3306 -h127.0.0.1

 

可以在不進入數據庫交互界面直接在外部執行數據庫命令,-e 參數:

mysql -uroot -p -e "show databases;"

效果如圖:

 

對於數據庫 SQL 腳本,也可以使用 < 導入:

新建 test,sql:

create database hello;

導入到數據庫:

# 導入
mysql -uroot -p < test,sql

# 查看
mysql -uroot -p -e "show databases;"

結果如下:

 

 

關於基礎配置文件

 

在初始化的時候將 MySQL 的配置文件放在 /etc/my.cnf

配置文件其實是可以放多個地方的,通過命令查看:

mysqld --help --verbose | grep 'my.cnf'

默認的加載路徑如圖:

可以使用 --defaults-file=xxx 指定具體的。

 

另外就是主配置文件的書寫,格式為:

[標簽]
配置項=xxx

對於標簽,MySQL 的配置可分為服務端和客戶端。

服務端:[mysqld] [mysqld_safe] [server]

客戶端:[mysql] [mysqldump] [client]

推薦使用 mysqld / mysql 的形式,否則其它命令可能會報錯某些參數無法識別,如:

[mysqld]
user=mysql
port=3306
basedir=/data/services/mysql
datadir=/data/data/mysql
pid-file=/data/logs/mysql/mysqld.pid
log-error=/data/logs/mysql/error.log
socket=/data/logs/mysql/mysql.sock
server_id=111

[mysql]
port=3306
socket=/data/logs/mysql/mysql.sock
prompt=3306/\\u [\\d]>

 

 

小結

 

本節都是一些安裝簡介,概念性,以及 MySQL 用戶授權管理的知識點。這些對於作為運維的我們來說可以算是必須掌握的。也很簡單。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM