學習預覽:
(一)mysql 運維基礎篇(Linux雲計算從入門到精通)
(三)mysql 觸發器、存儲過程和函數(數據庫運維基礎補充)
(五)mysql數據備份—物理備份(完備+lvm快照+xtrabackup)+邏輯備份(mysqldump+導入導出)
(六)mysql複製技術—M-S主從配置(傳統+GTID)+M-M-S-S主從配置(GTID)
(七)mysql中間件mycat配置和部署(基於M-M-S-S)
(八) 數據庫集羣技術—Galera Cluster安裝與配置
(九)數據庫集羣技術Galera+mycat(數據庫運維學習終章)
CONTEND
一、mysql安全機制
1.1 MySQL權限表
我們主要負責以下四種權限表的設置:
mysql.user Global level
用戶字段
權限字段
安全字段
資源控制字段
mysql.db Database level
用戶字段
權限字段
mysql.tables_priv Table level
mysql.columns_priv Column level
1.2 MySQL用戶管理
(1)1.登錄和退出MySQL
示例:
mysql -h192.168.5.240 -P 3306 -u root -p123 mysql -e 'select user,host from user'
-h 指定主機名 [默認爲localhost]
-P MySQL服務器端口 [默認3306]
-u指定用戶名 [默認root]
-p指定登錄密碼 [默認爲空密碼]
此處mysql爲指定登錄的數據庫
-e接SQL語句
(2)創建用戶
以前有的版本好像可以直接用grant同時創建用戶並授權的,我這個版本並不支持,不清楚的話用help看看語法。
CREATE USER語句創建,接着授權,後面在介紹授權的細節。對了,由於MySQL8.0之後的加密規則爲caching_sha2_password.而在此之前的加密規則爲mysql_native_password。要想其他客戶端連接的話,需要加上mysql_native_password哦,如下圖:
create user 'user1'@'localhost' identified with mysql_native_password by 'Root@123';--創建用戶
grant all on *.* to 'user1'@'localhost' ; --授權然後自己登陸試試
select * from user\G --可以在user表中查看自己創建的用戶信息
(3)刪除用戶
drop user 'user1'@'localhost';
(4)修改用戶密碼(我發現不同版本的mysql的設置語法不太一樣,不清楚用help)
#root修改自己的密碼,直接在終端修改
[root@Centos7-host1 ~]# mysqladmin -uroot -p'Root@123' password 'Root@321'
#或者在mysql裏修改,以下兩種都可以
mysql> alter user root@localhost identified by 'Root@123';
mysql> set password for root@localhost='Root@123';
#root修改其他用戶密碼
mysql> create user 'root1'@'localhost' identified with mysql_native_password by 'Root@123';--創建用戶
mysql> grant all on *.* to 'root1'@'localhost' ; --授權然後自己登陸試試
mysql> set password for [email protected]='Root@321' --修改密碼再重新登錄
#用戶修改自己的密碼
mysql> set password='Root@123';
1.3 MySQL權限管理
權限應用的順序:user ==> db ==> table_priv ==> columns_priv
示例:
create user 'admin1'@'localhost' identified with mysql_native_password by 'Root@123';
create user 'admin2'@'192.168.119.%' identified with mysql_native_password by 'Root@123';
create user 'admin3'@'192.168.119.156' identified with mysql_native_password by 'Root@123';
create user 'admin4'@'192.168.119.158' identified with mysql_native_password by 'Root@123';
grant all on *.* to admin1@localhost with grant option; --賦予admin所有權限,這個一般不建議
grant all on bbs.* to admin2@'192.168.119.%' ; --賦予admin2對bbs數據庫的管理權限
grant all on bbs.user to admin3@'192.168.119.156' ;--只賦予admin3對bbs數據庫中user表的管理權限
grant select(id),insert(name,age) on bbs.user to admin4@'192.168.119.158';--針對字段了,不過這個太變態了,很少用
刪除用戶很簡單: drop user admin1@'localhost';
二、MySQL日誌管理
2.1 錯誤日誌
配置方式:在配置文件中(my.cnf)中添加log_error=path 即可。錯誤日誌默認就是開啓的,默認存放在/var/log/mysqld.log下面,具體位置可通過查看/etc/my.conf文件得知。在運行mysql時候出現問題可通過查看該日誌助於排錯。
log-error=/var/log/mysqld.log 後面試錯誤日誌的存儲路徑#
2.2 二進制日誌(binlog)
二進制日誌作用是增量備份,數據恢復。他記錄了數據庫所有變化的操作,如DDL、DCL、DML,其實就是SQL語句
(1)配置介紹
server-id=6 #主從複製需要用到
log_bin=/var/log/binlog/mysql-bin #指定存放位置mysql-bin名稱前綴
binlog_format=row #日誌格式
#這個文件夾需要自己創的,並且授權給mysql用戶,重啓生效
[root@Centos7-host1 ~]# mkdir /var/log/binlog/
[root@Centos7-host1 ~]# chown mysql.mysql /var/log/binlog/
[root@Centos7-host1 ~]# systemctl restart mysqld
(2) 二進制日誌格式
- DDL和DCL,以statement(語句)方式直接記錄SQL
- DML(insert、update、delete),記錄的是已經提交的事物
- SBR :statement,記錄具體語句(5.6以下版本常用)
- RBR :Row ,記錄數據行的變化(常用)
- MBR :mixed,混合模式(一般不用)
(3) 日誌內容
以事件(event) 作爲記錄的最小單元
以下(截取)爲一個事件,以一個at開始,到下一個at結束
[root@Centos7-host1 ~]# mysqlbinlog /var/log/binlog/mysql-bin.000001
# at 4
#200410 18:05:57 server id 6 end_log_pos 124 CRC32 0x7eccf0b6 Start: binlog v 4, server v 8.0.19 created 200410 18:05:57 at startup
# at 124
(4)我們可以在mysql客戶端查看二進制的基本情況(ctrl+z==>fg在shell和mysql客戶端之間切換)
#查看有哪些二進制日誌
mysql> show binary logs;
+------------------+-----------+-----------+
| Log_name | File_size | Encrypted |
+------------------+-----------+-----------+
| mysql-bin.000001 | 178 | No |
| mysql-bin.000002 | 155 | No |
+------------------+-----------+-----------+
#刷新
mysql> flush logs;
mysql> show binary logs;
+------------------+-----------+-----------+
| Log_name | File_size | Encrypted |
+------------------+-----------+-----------+
| mysql-bin.000001 | 178 | No |
| mysql-bin.000002 | 202 | No |
| mysql-bin.000003 | 155 | No |
+------------------+-----------+-----------+
#查看正在使用的二進制日誌
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 | 155 | | | |
+------------------+----------+--------------+------------------+-------------------+
#查看某二進制日誌的事件信息
mysql> show binlog events in 'mysql-bin.000001';
+------------------+-----+----------------+-----------+-------------+-----------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+------------------+-----+----------------+-----------+-------------+-----------------------------------+
| mysql-bin.000001 | 4 | Format_desc | 6 | 124 | Server ver: 8.0.19, Binlog ver: 4 |
| mysql-bin.000001 | 124 | Previous_gtids | 6 | 155 | |
| mysql-bin.000001 | 155 | Stop | 6 | 178 | |
+------------------+-----+----------------+-----------+-------------+------------------
(5)二進制日誌的截取
注意:重啓mysqld和flush logs會截斷,reset master會刪除所有的binlog,這個要謹慎,否則以後有問題就沒法恢復了。
關於截取binlog有以下幾種方法,一般選擇position截取,然後進行恢復,關於數據恢復我會在在後面備份中學習總結下哦。
截取全部
# mysqlbinlog mysql-bin.000001
按datetime截取
# mysqlbinlog mysql-bin.000003 --start-datetime="2004-10-01 18:29:59"
# mysqlbinlog mysql-bin.000003 --stop-datetime="2004-10-02 18:29:59"
# mysqlbinlog mysql-bin.000003 --start-datetime="2004-10-01 18:29:59" --stop-datetime="2004-10-02 18:29:59"
按position截取
# mysqlbinlog mysql-bin.000003 --start-position=260
# mysqlbinlog mysql-bin.000003 --stop-position=260
# mysqlbinlog mysql-bin.000003 --start-position=260 --stop-position=360
2.3 slow log(慢日誌)
作用:記錄MYSQL運行期間執行較慢的語句,這樣可以告訴開發者哪裏有問題。
(1)配置情況
slow_query_log=1 #打開慢日誌
slow_query_log_file=/var/log/mysql_slow/slow.log #默認路徑可手動指定
long_query_time=5 #超過多長時間被定義爲慢語句
mkdir /var/log/mysql_slow
chown mysql.mysql /var/log/mysql_slow/
systemctl restart mysqld
(2)查看慢日誌是否打開,slow_query_log 狀態爲ON 表示打開。
mysql> show variables like '%slow%';
+---------------------------+------------------------------+
| Variable_name | Value |
+---------------------------+------------------------------+
| log_slow_admin_statements | OFF |
| log_slow_extra | OFF |
| log_slow_slave_statements | OFF |
| slow_launch_time | 2 |
| slow_query_log | ON |
| slow_query_log_file | /var/log/mysql_slow/slow.log |
+---------------------------+------------------------------+
(3) 查看慢日誌記錄時間
當查詢語句大於等於long_query_time這個值得時間(單位S)就會被定義爲查詢慢的語句,就會被慢日誌記錄起來
mysql> show variables like '%long%';
+----------------------------------------------------------+----------+
| Variable_name | Value |
+----------------------------------------------------------+----------+
| long_query_time | 5.000000 |
| performance_schema_events_stages_history_long_size | 10000 |
| performance_schema_events_statements_history_long_size | 10000 |
| performance_schema_events_transactions_history_long_size | 10000 |
| performance_schema_events_waits_history_long_size | 10000 |
+----------------------------------------------------------+----------+
(4)慢日誌測試
mysql> select benchmark(500000000,2*3); #就是一個函數,讓2*3計算這麼多次
+--------------------------+
| benchmark(500000000,2*3) |
+--------------------------+
| 0 |
+--------------------------+
1 row in set (7.88 sec)
#查看慢日誌是否有記錄
tail /var/log/mysql_slow/slow.log
#或者用這個查詢
mysqldumpslow -s c -t 3 slow.log