linux學習第十週總結

linux學習第十週總結

接着上週的mysql,重點終結日誌管理 ,備份還原,主從複製和mysql集羣

一、mysql日誌管理

事務日誌 transaction log
錯誤日誌 error log
通用日誌 general log
慢查詢日誌 slow query log
二進制日誌 binary log
中繼日誌 reley log

1.事務日誌
事務型存儲引擎自行管理和使用,建議和數據文件分開存放

redo log
undo log

Innodb事務日誌相關配置:

show variables like '%innodb_log%';
innodb_log_file_size 5242880 每個日誌文件大小
innodb_log_files_in_group 2 日誌組成員個數
innodb_log_group_home_dir ./ 事務文件路徑
innodb_flush_log_at_trx_commit 默認爲1innodb_flush_log_at_trx_commit

說明:設置爲1,同時sync_binlog = 1表示最高級別的容錯 innodb_use_global_flush_log_at_trx_commit的值確定是否可以使用SET語句重置此變量
1默認情況下,日誌緩衝區將寫入日誌文件,並在每次事務後執行刷新到磁盤。 這是完全遵守ACID特性
0提交時沒有任何操作; 而是每秒執行一次日誌緩衝區寫入和刷新。 這樣可以提供更好的性能,但服務器崩潰可以清除最後一秒的事務
2每次提交後都會寫入日誌緩衝區,但每秒都會進行一次刷新。 性能比0略好一些,但操作系統或停電可能導致最後一秒的交易丟失
3模擬MariaDB 5.5組提交(每組提交3個同步),此項MariaDB 10.0支持

2.錯誤日誌

mysqld啓動和關閉過程中輸出的事件信息
mysqld運行中產生的錯誤信息
event scheduler運行一個event時產生的日誌信息
在主從複製架構中的從服務器上啓動從服務器線程時產生的信息

錯誤日誌相關配置

SHOW GLOBAL VARIABLES LIKE 'log_error'
錯誤文件路徑
log_error=/PATH/TO/LOG_ERROR_FILE
是否記錄警告信息至錯誤日誌文件
log_warnings=1|0 默認值1
  1. 通用日誌

通用日誌:記錄對數據庫的通用操作,包括錯誤的SQL語句
文件:file,默認值
表:table
通用日誌相關設置
general_log=ON|OFF
general_log_file=HOSTNAME.log
log_output=TABLE|FILE|NONE

4.慢查詢日誌

slow_query_log=ON|OFF 開啓或關閉慢查詢
long_query_time=N 慢查詢的閥值,單位秒
slow_query_log_file=HOSTNAME-slow.log 慢查詢日誌文件
log_slow_filter = admin,filesort,filesort_on_disk,full_join,full_scan,
query_cache,query_cache_miss,tmp_table,tmp_table_on_disk
上述查詢類型且查詢時長超過long_query_time,則記錄日誌
log_queries_not_using_indexes=ON 不使用索引或使用全索引掃描,不論是否達到慢查詢閥值的語句是否記錄日誌,默認OFF,即不記錄
log_slow_rate_limit = 1 多少次查詢才記錄,mariadb特有
log_slow_verbosity= Query_plan,explain 記錄內容
log_slow_queries = OFF 同slow_query_log 新版已廢棄

5.二進制日誌

二進制日誌
記錄導致數據改變或潛在導致數據改變的SQL語句
記錄已提交的日誌
不依賴於存儲引擎類型
功能:通過“重放”日誌文件中的事件來生成數據副本
注意:建議二進制日誌和數據文件分開存放

6.中繼日誌:relay log

主從複製架構中,從服務器用於保存從主服務器的二進制日誌中讀取的事件

重點二進制日誌,與後邊備份還原,主從複製相關

1.二進制日誌記錄格式
二進制日誌記錄三種格式
基於“語句”記錄:statement,記錄語句,默認模式
基於“行”記錄:row,記錄數據,日誌量較大
混合模式:mixed, 讓系統自行判定該基於哪種方式進行
格式配置
show variables like ‘binlog_format';

2.二進制日誌文件的構成
有兩類文件
日誌文件:mysql|mariadb-bin.文件名後綴,二進制格式
如: mariadb-bin.000001
索引文件:mysql|mariadb-bin.index,文本格式

3.二進制日誌相關的服務器變量:
sql_log_bin=ON|OFF:是否記錄二進制日誌,默認ON
log_bin=/PATH/BIN_LOG_FILE:指定文件位置;默認OFF,表示不啓用二進制日誌功能,上述兩項都開啓纔可
binlog_format=STATEMENT|ROW|MIXED:二進制日誌記錄的格式,默認STATEMENT
max_binlog_size=1073741824:單個二進制日誌文件的最大體積,到達最大值會自動滾動,默認爲1G
說明:文件達到上限時的大小未必爲指定的精確值
sync_binlog=1|0:設定是否啓動二進制日誌即時同步磁盤功能,默認0,由操作系統負責同步日誌到磁盤
expire_logs_days=N:二進制日誌可以自動刪除的天數。 默認爲0,即不自動刪除

4.二進制日誌相關配置
查看mariadb自行管理使用中的二進制日誌文件列表,及大小
SHOW {BINARY | MASTER} LOGS
查看使用中的二進制日誌文件
SHOW MASTER STATUS
查看二進制文件中的指定內容
SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]
show binlog events in ‘mysql-bin.000001' from 6516 limit 2,3

mysqlbinlog:二進制日誌的客戶端命令工具

命令格式:

mysqlbinlog [OPTIONS] log_file…
--start-position=# 指定開始位置
--stop-position=#
--start-datetime=
--stop-datetime=
時間格式:YYYY-MM-DD hh:mm:ss
--base64-output[=name]
-v -vvv
示例:mysqlbinlog --start-position=6787 --stop-position=7527 /var/lib/mysql/mariadb-bin.000003 -v
mysqlbinlog --start-datetime="2018-01-30 20:30:10" --stop-datetime="2018-01-30 20:35:22" mariadb-bin.000003 -vvv

二進制日誌事件的格式:

# at 328
#151105 16:31:40 server id 1 end_log_pos 431 Query thread_id=1 exec_time=0 error_code=0
use `mydb`/*!*/;
SET TIMESTAMP=1446712300/*!*/;
CREATE TABLE tb1 (id int, name char(30))
/*!*/;
事件發生的日期和時間:151105 16:31:40
事件發生的服務器標識:server id 1
事件的結束位置:end_log_pos 431
事件的類型:Query
事件發生時所在服務器執行此事件的線程的ID:thread_id=1
語句的時間戳與將其寫入二進制文件中的時間差:exec_time=0
錯誤代碼:error_code=0
事件內容:
GTID:Global Transaction ID,mysql5.6以mariadb10以上版本專屬屬性:GTID

清除指定二進制日誌:

PURGE { BINARY | MASTER } LOGS
{ TO 'log_name' | BEFORE datetime_expr }
示例:
PURGE BINARY LOGS TO ‘mariadb-bin.000003’;刪除3之前的日誌
PURGE BINARY LOGS BEFORE '2017-01-23';
PURGE BINARY LOGS BEFORE '2017-03-22 09:25:30';
刪除所有二進制日誌,index文件重新記數
RESET MASTER [TO #]; 刪除所有二進制日誌文件,並重新生成日誌文件,文件名從#開始記數,默認從1開始,一般是master主機第一次啓動時執行,MariaDB10.1.6開始支持TO #
切換日誌文件:
FLUSH LOGS;

二、備份還原

爲什麼要備份
災難恢復:硬件故障、軟件故障、自然災害、******、誤操作測試等數據丟失場景

備份注意要點
能容忍最多丟失多少數據
恢復數據需要在多長時間內完成
需要恢復哪些數據
還原要點
做還原測試,用於測試備份的可用性
還原演練

備份類型:
完全備份,部分備份
完全備份:整個數據集
部分備份:只備份數據子集,如部分庫或表
完全備份、增量備份、差異備份
增量備份:僅備份最近一次完全備份或增量備份 (如果存在增量)以來變化的數據,備份較快,還原複雜
差異備份:僅備份最近一次完全備份以來變化的數據,備份較慢,還原簡單
注意:二進制日誌文件不應該與數據文件放在同一磁盤

冷、溫、熱備份
冷備:讀寫操作均不可進行
溫備:讀操作可執行;但寫操作不可執行
熱備:讀寫操作均可執行
MyISAM:溫備,不支持熱備
InnoDB:都支持

物理和邏輯備份
物理備份:直接複製數據文件進行備份,與存儲引擎有關,佔用較多的空間,速度快
邏輯備份:從數據庫中“導出”數據另存而進行的備份,與存儲引擎無關,佔用空間少,速度慢,可能丟失精度

備份工具

cp, tar等複製歸檔工具:物理備份工具,適用所有存儲引擎;只支持冷備;完全和部分備份
LVM的快照:先加鎖,做快照後解鎖,幾乎熱備;藉助文件系統工具進行備份
mysqldump:邏輯備份工具,適用所有存儲引擎,溫備;支持完全或部分備份;對InnoDB存儲引擎支持熱備,結合binlog的增量備份
xtrabackup:由Percona提供支持對InnoDB做熱備(物理備份)的工具,支持完全備份、增量備份
MariaDB Backup: 從MariaDB 10.1.26開始集成,基於Percona XtraBackup 2.3.8實現
mysqlbackup:熱備份, MySQL Enterprise Edition組件
mysqlhotcopy:PERL 語言實現,幾乎冷備,僅適用於MyISAM存儲引擎,使用LOCK TABLES、FLUSH TABLES和cp或scp來快速備份數據庫

實驗
1.MySQL的備份還原(mysqldump)

開啓二進制日誌
開啓二進制日誌需要將MySQL中的sql_log_bin和log_bin這兩個選項
1.開啓sql_log_bin
系統中默認開啓sql_log_bin選項所以此處無需修改

MariaDB [(none)]> SHOW VARIABLES LIKE 'sql_log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| sql_log_bin   | ON    |
+---------------+-------+
1 row in set (0.01 sec)
2.開啓log_bin
此選項需要對MySQL的配置文件進行修改,在修改之前需要先創建一個二進制日誌存放的位置。注意:不要和數據庫存放在統一磁盤內,不要和數據庫存放在統一磁盤內,不要和數據庫存放在統一磁盤內重要的事情說三遍。

[root@localhost ~]# mkdir /data/bin
[root@localhost ~]# chown -R mysql.mysql /data/bin  #將目錄的屬主和屬組都改爲mysql
二進制日誌目錄創建完畢後,修改配置文件,添加log-bin選項,並指定路徑,此處要注意mysql-bin是二進制日誌的擡頭。

[root@localhost ~]# vim /etc/mysql/my.cnf
log-bin=/data/bin/mysql-bin            #mysql-bin爲二進制日誌的文件名的擡頭
以上配置完成後重啓mysql服務

[root@localhost ~]# service mysqld restart
Restarting mysqld (via systemctl):                         [  OK  ]
此時二進制日誌目錄下已經多出了兩個二進制日誌文件

[root@localhost ~]# ll /data/bin/
total 12
-rw-rw---- 1 mysql mysql 351 May  6 16:51 mysql-bin.000001
-rw-rw---- 1 mysql mysql  54 May  6 16:51 mysql-bin.index

磁盤破壞恢復

一、對數據庫進行備份
[root@localhost ~]# mysql -e "SHOW DATABASES;"
+--------------------+
| Database           |
+--------------------+
| hellodb            |
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+

[root@localhost ~]# mysqldump -A --single-transaction --master-data=2 | xz > /data/all.sql.xz
二、備份完畢後數據庫發生小部分變化
MariaDB [(none)]> INSERT hellodb.students(stuid,name,gender,age) VALUE(26,'linchong','M',30) ;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> INSERT hellodb.students(stuid,name,gender,age) VALUE(27,'Lujunyi','M',30);
Query OK, 1 row affected (0.00 sec)
三、數據庫發生破壞,數據丟失
[root@localhost ~]# rm -rf /data/mysql/*
數據恢復
一、將mysqld服務停止
[root@localhost ~]# service mysqld stop
Stopping mysqld (via systemctl):                           [  OK  ]
二、查看下二進制日誌。
由於每次啓動服務都會重新生成一個新的二進制日誌,所以先查看下二進制日誌的編號以免等下在使用二進制日誌還原數據時還原了不必要的數據

[root@localhost ~]# ll /data/bin/
total 504
-rw-rw---- 1 mysql mysql    351 May  6 16:51 mysql-bin.000001
-rw-rw---- 1 mysql mysql   9388 May  6 17:01 mysql-bin.000002
-rw-rw---- 1 mysql mysql     81 May  6 17:03 mysql-bin.index
三、重啓MySQL服務,初始化數據庫
[root@localhost ~]# service mysqld start
Starting mysqld (via systemctl):                           [  OK  ]
[root@localhost ~]# ll /data/mysql/
total 122924
-rw-rw---- 1 mysql mysql    16384 May  6 17:01 aria_log.00000001
-rw-rw---- 1 mysql mysql       52 May  6 17:01 aria_log_control
drwx------ 2 mysql mysql      272 May  6 16:54 hellodb
-rw-rw---- 1 mysql mysql     1298 May  6 17:01 ib_buffer_pool
-rw-rw---- 1 mysql mysql 12582912 May  6 17:03 ibdata1
-rw-rw---- 1 mysql mysql 50331648 May  6 17:03 ib_logfile0
-rw-rw---- 1 mysql mysql 50331648 Apr 29 12:49 ib_logfile1
-rw-rw---- 1 mysql mysql 12582912 May  6 17:03 ibtmp1
-rw-rw---- 1 mysql mysql        6 May  6 17:03 localhost.localdomain.pid
-rw-rw---- 1 mysql mysql        0 Apr 29 12:57 multi-master.info
drwx------ 2 mysql root      4096 Apr 29 12:49 mysql
-rw-rw---- 1 mysql mysql      351 Apr 29 14:06 mysql-bin.000001
-rw-rw---- 1 mysql mysql      351 May  6 16:50 mysql-bin.000002
-rw-rw---- 1 mysql mysql       38 May  6 16:26 mysql-bin.index
-rw-rw---- 1 mysql mysql        0 May  6 16:50 mysql-bin.state
srwxrwxrwx 1 mysql mysql        0 May  6 17:03 mysql.sock
drwx------ 2 mysql mysql       20 Apr 29 12:49 performance_schema
drwx------ 2 mysql root         6 Apr 29 12:49 test
四、將完全備份解壓
[root@localhost ~]# unxz /data/all.sql.xz 
五、由於完全備份後數據又發生過改變所以需要利用二進制日誌進行還原在利用二進制還原前,先查看下完全備份時二進制日誌所在的位置。
[root@localhost ~]# vim /data/all.sql 
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=8946;
六、將完全備份後產生二進制日誌的數據導出
[root@localhost ~]# mysqlbinlog --start-position=8946 /data/bin/mysql-bin.000002 > /data/inc.sql
七、進入MySQL,停止二進制日誌記錄
由於接下來的操作是恢復數據,所以此處不需要讓二進制日誌記錄數據。

MariaDB [(none)]> SET sql_log_bin=off;
Query OK, 0 rows affected (0.00 sec)
八、導入之前做的完全備份
MariaDB [(none)]> source /data/all.sql
九、導入完全備份後產生的數據
MariaDB [(none)]> source /data/inc.sql
十、驗證
查看數據庫,以及完全備份後增加的內容是否存在

[root@localhost ~]# mysql -e 'SHOW DATABASES;SELECT * FROM hellodb.students where stuid>25;'
+--------------------+
| Database           |
+--------------------+
| hellodb            |
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
+-------+----------+-----+--------+---------+-----------+
| StuID | Name     | Age | Gender | ClassID | TeacherID |
+-------+----------+-----+--------+---------+-----------+
|    26 | linchong |  30 | M      |    NULL |      NULL |
|    27 | Lujunyi  |  30 | M      |    NULL |      NULL |
+-------+----------+-----+--------+---------+-----------+

誤刪除恢復

一、對數據庫進行備份
[root@localhost ~]# mysql -e "SHOW DATABASES;"
+--------------------+
| Database           |
+--------------------+
| hellodb            |
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+

[root@localhost ~]# mysqldump -A --single-transaction --master-data=2 | xz > /data/all.sql.xz
二、備份完畢後數據庫發生小部分變化
MariaDB [(none)]> INSERT hellodb.students(stuid,name,gender,age) VALUE(26,'linchong','M',30) ;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> INSERT hellodb.students(stuid,name,gender,age) VALUE(27,'Lujunyi','M',30);
Query OK, 1 row affected (0.00 sec)
三、數據庫發生破壞,數據丟失
[root@localhost ~]# rm -rf /data/mysql/*
數據恢復
一、將mysqld服務停止
[root@localhost ~]# service mysqld stop
Stopping mysqld (via systemctl):                           [  OK  ]
二、查看下二進制日誌。
由於每次啓動服務都會重新生成一個新的二進制日誌,所以先查看下二進制日誌的編號以免等下在使用二進制日誌還原數據時還原了不必要的數據

[root@localhost ~]# ll /data/bin/
total 504
-rw-rw---- 1 mysql mysql    351 May  6 16:51 mysql-bin.000001
-rw-rw---- 1 mysql mysql   9388 May  6 17:01 mysql-bin.000002
-rw-rw---- 1 mysql mysql     81 May  6 17:03 mysql-bin.index
三、重啓MySQL服務,初始化數據庫
[root@localhost ~]# service mysqld start
Starting mysqld (via systemctl):                           [  OK  ]
[root@localhost ~]# ll /data/mysql/
total 122924
-rw-rw---- 1 mysql mysql    16384 May  6 17:01 aria_log.00000001
-rw-rw---- 1 mysql mysql       52 May  6 17:01 aria_log_control
drwx------ 2 mysql mysql      272 May  6 16:54 hellodb
-rw-rw---- 1 mysql mysql     1298 May  6 17:01 ib_buffer_pool
-rw-rw---- 1 mysql mysql 12582912 May  6 17:03 ibdata1
-rw-rw---- 1 mysql mysql 50331648 May  6 17:03 ib_logfile0
-rw-rw---- 1 mysql mysql 50331648 Apr 29 12:49 ib_logfile1
-rw-rw---- 1 mysql mysql 12582912 May  6 17:03 ibtmp1
-rw-rw---- 1 mysql mysql        6 May  6 17:03 localhost.localdomain.pid
-rw-rw---- 1 mysql mysql        0 Apr 29 12:57 multi-master.info
drwx------ 2 mysql root      4096 Apr 29 12:49 mysql
-rw-rw---- 1 mysql mysql      351 Apr 29 14:06 mysql-bin.000001
-rw-rw---- 1 mysql mysql      351 May  6 16:50 mysql-bin.000002
-rw-rw---- 1 mysql mysql       38 May  6 16:26 mysql-bin.index
-rw-rw---- 1 mysql mysql        0 May  6 16:50 mysql-bin.state
srwxrwxrwx 1 mysql mysql        0 May  6 17:03 mysql.sock
drwx------ 2 mysql mysql       20 Apr 29 12:49 performance_schema
drwx------ 2 mysql root         6 Apr 29 12:49 test
四、將完全備份解壓
[root@localhost ~]# unxz /data/all.sql.xz 
五、由於完全備份後數據又發生過改變所以需要利用二進制日誌進行還原在利用二進制還原前,先查看下完全備份時二進制日誌所在的位置。
[root@localhost ~]# vim /data/all.sql 
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=8946;
六、將完全備份後產生二進制日誌的數據導出
[root@localhost ~]# mysqlbinlog --start-position=8946 /data/bin/mysql-bin.000002 > /data/inc.sql
七、進入MySQL,停止二進制日誌記錄
由於接下來的操作是恢復數據,所以此處不需要讓二進制日誌記錄數據。

MariaDB [(none)]> SET sql_log_bin=off;
Query OK, 0 rows affected (0.00 sec)
八、導入之前做的完全備份
MariaDB [(none)]> source /data/all.sql
九、導入完全備份後產生的數據
MariaDB [(none)]> source /data/inc.sql
十、驗證
查看數據庫,以及完全備份後增加的內容是否存在

[root@localhost ~]# mysql -e 'SHOW DATABASES;SELECT * FROM hellodb.students where stuid>25;'
+--------------------+
| Database           |
+--------------------+
| hellodb            |
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
+-------+----------+-----+--------+---------+-----------+
| StuID | Name     | Age | Gender | ClassID | TeacherID |
+-------+----------+-----+--------+---------+-----------+
|    26 | linchong |  30 | M      |    NULL |      NULL |
|    27 | Lujunyi  |  30 | M      |    NULL |      NULL |
+-------+----------+-----+--------+---------+-----------+

MySQL的備份還原(xtrabackup)

xtrabackup簡介
xtrabackup是percona提供的MySQL數據庫的備份工具,是唯一開源的能對innodb和xtradb數據庫進行熱備的工具

xtrabackup的特點
1.備份還原過程快、可靠
2.備份過程不會打斷正在執行的事務
3.能夠基於壓縮等功能介於磁盤空間和流量
4.自動實現備份檢驗
5.開源免費

xtrabackup安裝
xtrabackup在centos的EPEL源中,可以在配置完EPEL源後使用yum安裝

[root@localhost ~]# yum install -y percona-xtrabackup
也可以去官網下載最新版本的xtrabackup
https://www.percona.com/downloads/XtraBackup/LATEST

完全備份及還原

在完全備份之前需要創建一個備份的目錄作爲存放備份使用

[root@localhost ~]# mkdir /data/backup
數據庫內存放的數據

[root@localhost ~]# mysql -e 'SHOW DATABASES;'
+--------------------+
| Database           |
+--------------------+
| hellodb            |
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
一、完全備份
[root@localhost ~]# mariabackup --backup --target-dir=/data/backup  --user=root --password=''
二、對數據庫破壞
[root@localhost ~]# rm -rf /data/mysql/*
三、恢復
3.1在恢復數據庫前需要先將數據庫內數據清理,然後停止mysql服務

[root@localhost ~]# rm -rf /data/mysql/*
[root@localhost ~]# service mysqld stop
Stopping mysqld (via systemctl):                           [  OK  ]
3.2對備份目錄做整理

[root@localhost ~]# mariabackup --prepare --target-dir=/data/backup
3.3將整理好的備份數據還原至數據庫

[root@localhost ~]# mariabackup --copy-back --target-dir=/data/backup
3.4此時還原回去的數據屬性還有問題,需要將其修改

[root@localhost ~]# ll /data/mysql/
total 12320
-rw-r----- 1 root root    16384 May  6 21:28 aria_log.00000001
-rw-r----- 1 root root       52 May  6 21:28 aria_log_control
drwx------ 2 root root      272 May  6 21:28 hellodb
-rw-r----- 1 root root      942 May  6 21:28 ib_buffer_pool
-rw-r----- 1 root root 12582912 May  6 21:28 ibdata1
drwx------ 2 root root     4096 May  6 21:28 mysql
drwx------ 2 root root       20 May  6 21:28 performance_schema
drwx------ 2 root root       20 May  6 21:28 test
-rw-r----- 1 root root      527 May  6 21:28 xtrabackup_info

[root@localhost ~]# chown -R mysql.mysql /data/mysql/
四、啓動服務測試
[root@localhost ~]# service mysqld start
Starting mysqld (via systemctl):                           [  OK  ]
[root@localhost ~]# mysql -e "SHOW DATABASES;SHOW TABLES FROM hellodb;"
+--------------------+
| Database           |
+--------------------+
| hellodb            |
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
+-------------------+
| Tables_in_hellodb |
+-------------------+
| classes           |
| coc               |
| courses           |
| scores            |
| students          |
| teachers          |
| toc               |
+-------------------+

完全備份+增量備份及還原

在備份之前先創建出完全備份的目錄以及增量備份的目錄

[root@localhost ~]# mkdir -pv /dataa/backup/{full,inc1,inc2}
mkdir: created directory ‘/data/backup’
mkdir: created directory ‘/data/backup/full’
mkdir: created directory ‘/data/backup/inc1’
mkdir: created directory ‘/data/backup/inc2’
數據庫內所存放的數據

[root@localhost ~]# mysql -e 'SHOW DATABASES;'
+--------------------+
| Database           |
+--------------------+
| hellodb            |
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
一、對數據進行完全備份
[root@localhost ~]# mariabackup --backup --target-dir=/data/backup/full --user=root --password=''
二、此時數據庫內數據發生變化
[root@localhost ~]# mysql -e "INSERT hellodb.teachers VALUE(5,'Li Xiaolong',30,'M');"
[root@localhost ~]# mysql -e "SELECT * FROM hellodb.teachers WHERE tid>4;"
+-----+-------------+-----+--------+
| TID | Name        | Age | Gender |
+-----+-------------+-----+--------+
|   5 | Li Xiaolong |  30 | M      |
+-----+-------------+-----+--------+
三、對數據庫進行增量備份
[root@localhost ~]# mariabackup --user=root --password='' --backup --incremental-basedir=/data/backup/full --target-dir=/data/backup/inc1
四、數據庫內數據再次發生變化
[root@localhost ~]# mysql -e "INSERT hellodb.students(stuid,age,name) VALUE (26,35,'Sun Wukong');"
[root@localhost ~]# mysql -e "SELECT * FROM hellodb.students WHERE stuid>25;"
+-------+------------+-----+--------+---------+-----------+
| StuID | Name       | Age | Gender | ClassID | TeacherID |
+-------+------------+-----+--------+---------+-----------+
|    26 | Sun Wukong |  35 | F      |    NULL |      NULL |
+-------+------------+-----+--------+---------+-----------+
五、再次對數據庫做增量備份
[root@localhost ~]# mariabackup --user=root --password='' --backup --incremental-basedir=/data/backup/inc1 --target-dir=/data/backup/inc2
六、破壞數據庫
[root@localhost ~]# rm -rf /data/mysql/*
七、恢復數據庫
7.1先對數據庫做清理,並停止數據庫服務

[root@localhost ~]# rm -rf /data/mysql/*
[root@localhost ~]# service mysqld stop
Stopping mysqld (via systemctl):                           [  OK  ]
7.2對完全備份做預整理
因爲後續還有增量備份,所以此處需要使用apply-log-only選項來阻止事務的回滾。

[root@localhost ~]# mariabackup --prepare --apply-log-only --target-dir=/data/backup/full
7.3合併第一次的增量備份
此爲第一個增量備份後續還有第二個增量所以需要使用apply-log-only阻止回滾事務

[root@localhost backup]# mariabackup --prepare --apply-log-only --target-dir=/data/backup/full --incremental-dir=/data/backup/inc1
7.3合併第二次的增量備份
此爲最後個增量備份無需再使用apply-log-only阻止回滾事務

[root@localhost backup]# mariabackup --prepare --target-dir=/data/backup/full --incremental-dir=/data/backup/inc2
7.4整理完畢將備份複製回數據庫

[root@localhost backup]# mariabackup --copy-back --target-dir=/data/backup/full
7.5將數據庫內的屬主和屬組進行更改

[root@localhost backup]# chown -R mysql.mysql /data/mysql/
八、重啓服務測試

[root@localhost backup]# service mysqld start
Starting mysqld (via systemctl):                           [  OK  ]

[root@localhost backup]# msyql
MariaDB [hellodb]> select *from students where stuid>25;
+-------+------------+-----+--------+---------+-----------+
| StuID | Name       | Age | Gender | ClassID | TeacherID |
+-------+------------+-----+--------+---------+-----------+
|    26 | Sun Wukong |  35 | F      |    NULL |      NULL |
+-------+------------+-----+--------+---------+-----------+
1 row in set (0.00 sec)

MariaDB [hellodb]> select *from teachers where tid>4;
+-----+-------------+-----+--------+
| TID | Name        | Age | Gender |
+-----+-------------+-----+--------+
|   5 | Li Xiaolong |  30 | M      |
+-----+-------------+-----+--------+
1 row in set (0.00 sec)

其他的注意事項
1.在數據恢復之前必須先要停止MySQL服務
2.在還原時MySQL的數據庫目錄必須爲空,否則不會覆蓋
3.數據庫內容還原後,其屬主和屬組爲root需要手動將其全部改爲mysql

三、 主從複製

mysql的主從複製
所有的關係型數據庫都存在一個通病性能差,在企業中如果用戶量特別打,將所有的數據都存放在一臺服務器上,其性能時遠遠達不到要求的。所以需要使用一些手段來解決其性能的問題。
提升性能的方式有向上擴展以及向外擴展

向上擴展(Scale Up):使用更新更好的硬件,但硬件在怎麼更新也有其性能的極限。盲目的向上擴展無法結局根本的問題
向外擴展(Scale Out):就是使用多臺機器分攤壓力來提供服務

主從複製就是拿多個數據庫服務器,組合成一個服務器的集合對外共同服務實現性能的提升,邏輯上使用的時對外擴展的方式(Scale out)來提升服務器的性能。

新主機搭建主從複製搭建
服務器類型   ip地址
主   192.168.73.133
從   192.168.73.145
主服務器操作
1.在主服務器上啓用二進制日誌

[root@localhost ~]# vim /etc/mysql/my.cnf 
log-bin=/data/bin/mysql-bin
binlog-format=row
server-id=1
2.創建二進制日誌目錄

[root@localhost ~]# mkdir /data/bin
[root@localhost ~]# chown -R mysql.mysql /data/bin
3.重啓服務

[root@localhost ~]# service mysqld restart
Restarting mysqld (via systemctl):                         [  OK  ]
4.創建一個用來讓從服務器複製數據的賬號

MariaDB [(none)]> GRANT REPLICATION SLAVE ON *.* TO repluser@'192.168.73.%' IDENTIFIED BY 'centos';
Query OK, 0 rows affected (0.00 sec)
5.查看主服務器正在使用的二進制日誌

MariaDB [(none)]> SHOW MASTER LOGS;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |       515 |    #當前二進制文件及位置需要記錄,從服務器設置時需要
+------------------+-----------+
1 row in set (0.00 sec)
從服務器操作
1.修改配置文件

server-id       = 2     #server-id改爲和主服務器不同
read-only               #設置爲只讀
#log-bin=mysql-bin      #將二進制日誌關閉
2.啓動MySQL服務器

[root@localhost ~]# service mysqld restart
Starting mysqld (via systemctl):                           [  OK  ]
3.關聯主服務器

MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='192.168.73.133',MASTER_USER='repluser',MASTER_PASSWORD='centos',MASTER_PORT=3306,MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=515;
Query OK, 0 rows affected (0.01 sec)
4.查看從服務器狀態

MariaDB [(none)]> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
            Slave_IO_State: 
                Master_Host: 192.168.73.133
                Master_User: repluser
                Master_Port: 3306
                Connect_Retry: 60
            Master_Log_File: mysql-bin.000001
        Read_Master_Log_Pos: 515
            Relay_Log_File: localhost-relay-bin.000001
                Relay_Log_Pos: 4
        Relay_Master_Log_File: mysql-bin.000001
            Slave_IO_Running: No
            Slave_SQL_Running: No
            Replicate_Do_DB: 
        Replicate_Ignore_DB: 
        Replicate_Do_Table: 
    Replicate_Ignore_Table: 
    Replicate_Wild_Do_Table: 
Replicate_Wild_Ignore_Table: 
                Last_Errno: 0
                Last_Error: 
                Skip_Counter: 0
        Exec_Master_Log_Pos: 515
            Relay_Log_Space: 256
            Until_Condition: None
            Until_Log_File: 
                Until_Log_Pos: 0
        Master_SSL_Allowed: No
        Master_SSL_CA_File: 
        Master_SSL_CA_Path: 
            Master_SSL_Cert: 
            Master_SSL_Cipher: 
            Master_SSL_Key: 
        Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
            Last_SQL_Errno: 0
            Last_SQL_Error: 
Replicate_Ignore_Server_Ids: 
            Master_Server_Id: 0
            Master_SSL_Crl: 
        Master_SSL_Crlpath: 
                Using_Gtid: No
                Gtid_IO_Pos: 
    Replicate_Do_Domain_Ids: 
Replicate_Ignore_Domain_Ids: 
                Parallel_Mode: conservative
                    SQL_Delay: 0
        SQL_Remaining_Delay: NULL
    Slave_SQL_Running_State: 
1 row in set (0.00 sec)

ERROR: No query specified
5.啓動線程

MariaDB [(none)]> START SLAVE;
Query OK, 0 rows affected (0.00 sec)
測試
在主服務器上導入一個hellodb數據庫

[root@localhost ~]# mysql < hellodb_innodb.sql 
從服務器上查看是否同步成功

MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| hellodb            |      #已經有hellodb庫
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.00 sec)
主服務器已有數據的情況下搭建主從
擁有一臺已經有數據的mysql服務器,追加一臺從服務器

服務器 IP地址
Master  192.168.73.148
Slave   192.168.73.149
Master中的數據

[root@localhost ~]# mysql -e "SHOW DATABASES;"
+--------------------+
| Database           |
+--------------------+
| information_schema |
| hellodb            |
| mysql              |
| performance_schema |
| test               |
| test1              |
+--------------------+
配置主服務器
1.修改主服務器配置文件

[root@localhost ~]# vim /etc/my.cnf
[mysqld]
log-bin=/data/bin/mysql-bin
binlog-format=row
[root@localhost ~]# systemctl restart mariadb
2.創建複製賬號

[root@localhost ~]# mysql -e "GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'192.168.73.%' IDENTIFIED BY 'centos';"
3.備份主節點中的所有數據

[root@localhost ~]# mysqldump -A --single-transaction -F --master-data=1 > /data/all.sql
[root@localhost ~]# vim /data/all.sql
4.將備份數據傳送給從節點

[root@localhost ~]# scp /data/all.sql 192.168.73.149:/data
配置從服務器
1.修改配置文件

[root@localhost ~]# vim /etc/my.cnf
[mysqld]
server-id=2
read-only
2.清空MySQL數據庫

[root@localhost ~]# rm -rf /var/lib/mysql/*
3.修改備份數據將chang master to 加入文件中

CHANGE MASTER TO
MASTER_HOST='192.168.73.148',
MASTER_USER='repluser',
MASTER_PASSWORD='centos',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000005',
MASTER_LOG_POS=245;
4.啓動MySQL服務,並導入備份

[root@localhost ~]# mysql < /data/all.sql 
5.查看從節點狀態

MariaDB [(none)]> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
            Slave_IO_State: 
                Master_Host: 192.168.73.148
                Master_User: repluser
                Master_Port: 3306
                Connect_Retry: 60
            Master_Log_File: mysql-bin.000005
        Read_Master_Log_Pos: 245
            Relay_Log_File: mariadb-relay-bin.000001
                Relay_Log_Pos: 4
        Relay_Master_Log_File: mysql-bin.000005
            Slave_IO_Running: No
            Slave_SQL_Running: No
            Replicate_Do_DB: 
        Replicate_Ignore_DB: 
        Replicate_Do_Table: 
    Replicate_Ignore_Table: 
    Replicate_Wild_Do_Table: 
Replicate_Wild_Ignore_Table: 
                Last_Errno: 0
                Last_Error: 
                Skip_Counter: 0
        Exec_Master_Log_Pos: 245
            Relay_Log_Space: 245
            Until_Condition: None
            Until_Log_File: 
                Until_Log_Pos: 0
        Master_SSL_Allowed: No
        Master_SSL_CA_File: 
        Master_SSL_CA_Path: 
            Master_SSL_Cert: 
            Master_SSL_Cipher: 
            Master_SSL_Key: 
        Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
            Last_SQL_Errno: 0
            Last_SQL_Error: 
Replicate_Ignore_Server_Ids: 
            Master_Server_Id: 0
1 row in set (0.00 sec)
6.啓動線程

MariaDB [(none)]> START SLAVE;
Query OK, 0 rows affected (0.00 sec)
7.再次查看從節點狀態,複製的2個線程已經啓動

MariaDB [(none)]> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
            Slave_IO_State: Waiting for master to send event
                Master_Host: 192.168.73.148
                Master_User: repluser
                Master_Port: 3306
                Connect_Retry: 60
            Master_Log_File: mysql-bin.000005
        Read_Master_Log_Pos: 245
            Relay_Log_File: mariadb-relay-bin.000002
                Relay_Log_Pos: 529
        Relay_Master_Log_File: mysql-bin.000005
            Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
            Replicate_Do_DB: 
        Replicate_Ignore_DB: 
        Replicate_Do_Table: 
    Replicate_Ignore_Table: 
    Replicate_Wild_Do_Table: 
Replicate_Wild_Ignore_Table: 
                Last_Errno: 0
                Last_Error: 
                Skip_Counter: 0
        Exec_Master_Log_Pos: 245
            Relay_Log_Space: 825
            Until_Condition: None
            Until_Log_File: 
                Until_Log_Pos: 0
        Master_SSL_Allowed: No
        Master_SSL_CA_File: 
        Master_SSL_CA_Path: 
            Master_SSL_Cert: 
            Master_SSL_Cipher: 
            Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
            Last_SQL_Errno: 0
            Last_SQL_Error: 
Replicate_Ignore_Server_Ids: 
            Master_Server_Id: 1
1 row in set (0.00 sec)
測試
主節點刪test1庫

MariaDB [(none)]> DROP DATABASE  test1;
Query OK, 1 row affected (0.01 sec)
從節點查看是否同步

MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| hellodb            |
| mysql              |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.00 sec)      #已經沒有test1庫

MySQL主從複製出錯的解決方法

主從複製中若是出現錯誤可以通過幾個方法來進行解決
1.如果主從複製時發生了主鍵衝突,從而阻止了主從複製,可以使用sql_slave_skip_counter這個變量來忽略錯誤將其排除
2.如果發生了較大的錯誤,可以考慮使用reset slave的方法重新配置從服務器來恢復錯誤

以下演示如何使用這兩種方法解決錯誤,及相關操作的詳細說明

reset slave的使用方法
環境準備搭建主從同步

主節點配置  
1.修改配置文件

[root@Master ~]# vim /etc/my.cnf
[mysqld]
log-bin=/data/bin/mysql-bin
binlog-format=row
server-id=1
2.創建二進制日誌目錄

[root@Master ~]# mkdir /data/bin
[root@Master ~]# chown -R mysql.mysql /data/bin
3.啓動mysqld服務

[root@Master ~]# systemctl start mariadb
4.查看主服務器日誌位置

[root@Master ~]# mysql -e "SHOW MASTER LOGS;"
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |     26753 |
| mysql-bin.000002 |    921736 |
| mysql-bin.000003 |       245 |
+------------------+-----------+
5.創建一個用來複制數據的賬戶

[root@Master ~]# mysql -e "GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'192.168.73.%' IDENTIFIED BY 'centos';"
從節點配置
1.修改配置文件

[root@Slave ~]# vim /etc/my.cnf
[mysqld]
read-only
server-id=2
2.啓動服務

[root@Slave ~]# systemctl start mariadb
此處開始構建錯誤配置 
以下所有CHANGE MASTER TO配置均爲錯誤 
3.配置CHANGE MASTER TO

MariaDB [(none)]&gt; CHANGE MASTER TO
-&gt;   MASTER_HOST='master2.mycompany.com',
-&gt;   MASTER_USER='replication',
-&gt;   MASTER_PASSWORD='bigs3cret',
-&gt;   MASTER_PORT=3306,
-&gt;   MASTER_LOG_FILE='master2-bin.001',
-&gt;   MASTER_LOG_POS=4,
-&gt;   MASTER_CONNECT_RETRY=10;
Query OK, 0 rows affected (0.00 sec)
4.查看下SLAVE STATUS

MariaDB [(none)]&gt; SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
            Slave_IO_State: 
                Master_Host: master2.mycompany.com
                Master_User: replication
                Master_Port: 3306
            Connect_Retry: 10
            Master_Log_File: master2-bin.001
        Read_Master_Log_Pos: 4
            Relay_Log_File: mariadb-relay-bin.000001
            Relay_Log_Pos: 4
    Relay_Master_Log_File: master2-bin.001
            Slave_IO_Running: No
        Slave_SQL_Running: No
    ...以下省略...
5.啓動複製線程

MariaDB [(none)]&gt; START SLAVE;
6.再次查看SLAVE STATUS

MariaDB [(none)]&gt; SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
            Slave_IO_State: Connecting to master
                Master_Host: master2.mycompany.com
                Master_User: replication
                Master_Port: 3306
            Connect_Retry: 10
            Master_Log_File: master2-bin.001
        Read_Master_Log_Pos: 4
            Relay_Log_File: mariadb-relay-bin.000001
            Relay_Log_Pos: 4
    Relay_Master_Log_File: master2-bin.001
            Slave_IO_Running: Connecting
        Slave_SQL_Running: Yes
    ...以下省略...
線程已經正常啓動 
主服務器導入數據進行測試

[root@Master ~]# mysql &lt; hellodb_innodb.sql 
[root@Master ~]# mysql -e "SHOW DATABASES;"
+--------------------+
| Database           |
+--------------------+
| information_schema |
| hellodb            |
| mysql              |
| performance_schema |
| test               |
+--------------------+
從服務器查看是否同步(CHANGE MASTER TO信息不對怎麼可能同步)

MariaDB [(none)]&gt; SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
4 rows in set (0.00 sec)
以下爲錯誤解決方法
由於錯誤發生在CHANGE MASTER TO所以此處將CHANG MASTER TO部分糾正就行
1.首先將從服務器的複製線程停止

MariaDB [(none)]> STOP SLAVE;
Query OK, 0 rows affected (17.48 sec)
2.將從服務器上的SLAVE信息重置

MariaDB [(none)]> RESET SLAVE;
Query OK, 0 rows affected (0.01 sec)
3.重新輸入正確的CHANGE MASTER TO信息

MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='192.168.73.110',MASTER_USER='repluser',MASTER_PASSWORD='centos',MASTER_PORT=3306,MASTER_LOG_FILE='mysql-bin.000003',MASTER_LOG_POS=245;
Query OK, 0 rows affected (0.01 sec)
4.查看SLAVE STATUS;

MariaDB [(none)]> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
            Slave_IO_State: 
                Master_Host: 192.168.73.110
                Master_User: repluser
                Master_Port: 3306
                Connect_Retry: 10
            Master_Log_File: mysql-bin.000003
        Read_Master_Log_Pos: 245
            Relay_Log_File: mariadb-relay-bin.000001
                Relay_Log_Pos: 4
        Relay_Master_Log_File: mysql-bin.000003
            Slave_IO_Running: No
            Slave_SQL_Running: No
            Replicate_Do_DB: 
#此處信息已經改爲正確
5.重新啓動線程

MariaDB [(none)]> START SLAVE;
Query OK, 0 rows affected (0.00 sec)
6.再次查看SLAVE STATUS;

MariaDB [(none)]> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
            Slave_IO_State: Waiting for master to send event
                Master_Host: 192.168.73.110
                Master_User: repluser
                Master_Port: 3306
                Connect_Retry: 10
            Master_Log_File: mysql-bin.000003
        Read_Master_Log_Pos: 7384     #已經有數據複製過來了
            Relay_Log_File: mariadb-relay-bin.000002
                Relay_Log_Pos: 7668
        Relay_Master_Log_File: mysql-bin.000003
            Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
#IO和SQL線程已經啓動
7.查看下從節點內的庫是否已經同步

MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| hellodb            |          #hellodb庫已經從主節點中複製過來了
| mysql              |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.01 sec)
其他說明:
如果生產中,發生主從節點之間的數據偏差較大並且遲遲不能同步,可以考慮將從服務器全部清除從新配置從服務器。具體配置方法可以參考https://blog.51cto.com/11886307/2390636

關於sql_slave_skip_counter的使用方法
當發生主鍵衝突時,從服務器會卡在出錯的位置不再進行服務,此種錯誤一般會出現在主主複製或者從服務器已經佔用了某條記錄的情況下,此時可以使用此選項來忽略錯誤。

構建錯誤
此處繼續沿用剛纔的主從複製環境 
1.在從服務器上創建一條記錄

MariaDB [(none)]> INSERT hellodb.teachers VALUE (5,'Li Xiaolong',30,'M');
Query OK, 1 row affected (0.00 sec)
2.在主服務器上也創建一條主鍵相同的記錄

MariaDB [(none)]> INSERT hellodb.teachers VALUE (5,'Xiao Yan',20,'M');
Query OK, 1 row affected (0.00 sec)
3.返回從節點查看SLAVE STATUS

MariaDB [(none)]> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
            Slave_IO_State: Waiting for master to send event
                Master_Host: 192.168.73.110
                Master_User: repluser
                Master_Port: 3306
                Connect_Retry: 10
            Master_Log_File: mysql-bin.000003
        Read_Master_Log_Pos: 7576
            Relay_Log_File: mariadb-relay-bin.000002
                Relay_Log_Pos: 7668
        Relay_Master_Log_File: mysql-bin.000003
            Slave_IO_Running: Yes
            Slave_SQL_Running: No
            Replicate_Do_DB: 
        Replicate_Ignore_DB: 
        Replicate_Do_Table: 
    Replicate_Ignore_Table: 
    Replicate_Wild_Do_Table: 
Replicate_Wild_Ignore_Table: 
                Last_Errno: 1062
                Last_Error: Could not execute Write_rows event on table hellodb.teachers; Duplicate entry '5' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log mysql-bin.000003, end_log_pos 7549
                Skip_Counter: 0
        Exec_Master_Log_Pos: 7384
            Relay_Log_Space: 8156
            Until_Condition: None
            Until_Log_File: 
                Until_Log_Pos: 0
        Master_SSL_Allowed: No
        Master_SSL_CA_File: 
        Master_SSL_CA_Path: 
            Master_SSL_Cert: 
            Master_SSL_Cipher: 
            Master_SSL_Key: 
        Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
            Last_SQL_Errno: 1062
            Last_SQL_Error: Could not execute Write_rows event on table hellodb.teachers; Duplicate entry '5' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log mysql-bin.000003, end_log_pos 7549
Replicate_Ignore_Server_Ids: 
            Master_Server_Id: 1
1 row in set (0.00 sec)
4.從節點已經出錯,在主節點繼續添加記錄

MariaDB [(none)]> INSERT hellodb.teachers VALUE (6,'Xiao Xuner',20,'M');
Query OK, 1 row affected (0.00 sec)
5.此時從節點已經不會再繼續從主節點複製信息

MariaDB [(none)]> SELECT * FROM hellodb.teachers WHERE tid>4;
+-----+-------------+-----+--------+
| TID | Name      | Age |Gender |
+-----+-------------+-----+--------+
|   5 | Li Xiaolong |  30 | M      |   #此爲剛纔從節點添加的記錄
+-----+-------------+-----+--------+
1 row in set (0.00 sec)
排錯
1.使用sql_slave_skip_counter變量忽略錯誤

MariaDB [(none)]> SET GLOBAL sql_slave_skip_counter=1;
Query OK, 0 rows affected (0.00 sec)
2.停止線程並重新啓動

MariaDB [(none)]> STOP SLAVE;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> START SLAVE;
Query OK, 0 rows affected (0.00 sec)
3.查看slave status狀態,此時已經沒有報錯的信息

MariaDB [(none)]> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
            Slave_IO_State: Waiting for master to send event
                Master_Host: 192.168.73.110
                Master_User: repluser
                Master_Port: 3306
                Connect_Retry: 10
            Master_Log_File: mysql-bin.000003
        Read_Master_Log_Pos: 7770
            Relay_Log_File: mariadb-relay-bin.000003
                Relay_Log_Pos: 529
        Relay_Master_Log_File: mysql-bin.000003
            Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
            Replicate_Do_DB: 
        Replicate_Ignore_DB: 
        Replicate_Do_Table: 
    Replicate_Ignore_Table: 
    Replicate_Wild_Do_Table: 
Replicate_Wild_Ignore_Table: 
                Last_Errno: 0
                Last_Error: 
                Skip_Counter: 0
        Exec_Master_Log_Pos: 7770
            Relay_Log_Space: 8634
            Until_Condition: None
            Until_Log_File: 
                Until_Log_Pos: 0
        Master_SSL_Allowed: No
        Master_SSL_CA_File: 
        Master_SSL_CA_Path: 
            Master_SSL_Cert: 
            Master_SSL_Cipher: 
            Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
            Last_SQL_Errno: 0
            Last_SQL_Error: 
Replicate_Ignore_Server_Ids: 
            Master_Server_Id: 1
1 row in set (0.00 sec)
4.在從服務器上查看teachers表

MariaDB [(none)]> SELECT * FROM hellodb.teachers WHERE tid>4;
+-----+-------------+-----+--------+
| TID | Name        | Age | Gender |
+-----+-------------+-----+--------+
|   5 | Li Xiaolong |  30 | M      |
|   6 | Xiao Xuner  |  20 | M      |    #此時剛纔在主節點插入的6號記錄已經複製過來
+-----+-------------+-----+--------+
2 rows in set (0.00 sec)
以上爲主從複製時出錯的一些相關的修復方法

MySQL級聯複製
在生產換進中有一種主從複製的方法主節點先將數據同步到一箇中間的從節點,然後由從節點給後續的其他從節點來複制數據,這種複製方式稱爲級聯複製。

級聯複製的好處是可以極大的減輕主節點的壓力
級聯複製在配置時需要在中間節點上啓用log_slave_updates的選項。

級聯複製的配置方法
準備主機4臺,1臺主節點(Master),1臺中間從節點(Slave),1臺從節點(Slave1)

主機  系統  ip
Master  CentOS7 192.168.73.110
Slave   CentOS7 192.168.73.111
Slave1  CentOS7 192.168.73.112

主節點配置(Master)

1.修改配置文件

[mysqld]
log-bin=/data/bin/mysql-bin         #啓動二進制日誌
binlog-format=row                   #修改日誌格式
server-id=1                         
2.創建二級制日誌目錄

[root@Master ~]# mkdir /data/bin
[root@Master ~]# chown -R mysql.mysql /data/bin
3.啓動服務,查看當前二進制日誌所在的位置

[root@Master ~]# systemctl start mariadb
[root@Master ~]# mysql -e "SHOW MASTER LOGS;"
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |     26753 |
| mysql-bin.000002 |    921736 |
| mysql-bin.000003 |       245 |      #記錄當前二進制的位置
+------------------+-----------+
4.創建一個用來複制數據的賬戶

[root@Master ~]# mysql -e "GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'192.168.73.%' IDENTIFIED BY 'centos';"

中間從節點配置

1.修改配置文件

[root@Slave ~]# vim /etc/my.cnf
[mysqld]
log-bin=/data/bin/mysql-bin
binlog-format=row
read-only
log_slave_updates
server-id=2
2.創建二進制日誌目錄

[root@Slave ~]# mkdir /data/bin
[root@Slave ~]# chown -R mysql.mysql /data/bin
3.啓動MySQL服務

[root@Slave ~]# systemctl start mariadb
4.寫入CHANGE MASTER TO信息

CHANGE MASTER TO
MASTER_HOST='192.168.73.110',
MASTER_USER='repluser',
MASTER_PASSWORD='centos',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000003',
MASTER_LOG_POS=245;
Query OK, 0 rows affected (0.01 sec)
5.查看下從節點的配置狀態

MariaDB [(none)]> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
            Slave_IO_State: 
                Master_Host: 192.168.73.110
                Master_User: repluser
                Master_Port: 3306
                Connect_Retry: 60
            Master_Log_File: mysql-bin.000003
        Read_Master_Log_Pos: 245
            Relay_Log_File: mariadb-relay-bin.000001
                Relay_Log_Pos: 4
        Relay_Master_Log_File: mysql-bin.000003
            Slave_IO_Running: No           #線程尚未開啓
            Slave_SQL_Running: No           #線程尚未開啓
6.啓動線程

MariaDB [(none)]> START SLAVE;
Query OK, 0 rows affected (0.00 sec)
7.再次查看從節點狀態

MariaDB [(none)]> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
            Slave_IO_State: Waiting for master to send event
                Master_Host: 192.168.73.110
                Master_User: repluser
                Master_Port: 3306
                Connect_Retry: 60
            Master_Log_File: mysql-bin.000003
        Read_Master_Log_Pos: 402          #已經有小部分數據被複制過來
            Relay_Log_File: mariadb-relay-bin.000002
                Relay_Log_Pos: 686
        Relay_Master_Log_File: mysql-bin.000003
            Slave_IO_Running: Yes          #線程已經啓動
            Slave_SQL_Running: Yes          #線程已經啓動
8.測試
8.1在主節點導入數據庫

[root@Master ~]# mysql < hellodb_innodb.sql 
[root@Master ~]# mysql -e "SHOW DATABASES;"
+--------------------+
| Database           |
+--------------------+
| information_schema |
| hellodb            |
| mysql              |
| performance_schema |
| test               |
+--------------------+
8.2從節點查看是否已經同步

[root@Slave ~]# mysql -e "SHOW DATABASES;"
+--------------------+
| Database           |
+--------------------+
| information_schema |
| hellodb            |
| mysql              |
| performance_schema |
| test               |
+--------------------+

配置Slave1

由於此時各節點上已經有數據,作爲後來追加的從服務器,首先需要將之前的所有數據使用備份恢復一次然後再進行主從複製進行同步
1.在中間節點上將數據庫備份出來,並將數據傳送到後續的Slave1主機上

[root@Slave ~]# mysqldump -A --single-transaction -F --master-data=1 > /data/all.sql
[root@Slave ~]# scp /data/all.sql 192.168.73.112:/data
2.在Slave1主機上修改配置文件

[root@Slave1 ~]# vim /etc/my.cnf
[mysqld]
read-only
server-id=3
3.啓動MySQL服務

[root@Slave1 ~]# systemctl start mariadb
4.對備份文件做修改
找到CHANGE MASTER TO行對信息加以修改

[root@Slave1 ~]# vim /data/all.sql
CHANGE MASTER TO MASTER_HOST='192.168.73.111',MASTER_USER='repluser',MASTER_PASSWORD='centos',MASTER_PORT=3306,MASTER_LOG_FILE='mysql-bin.000004', MASTER_LOG_POS=245;
5.將修改後的備份文件導入數據庫

[root@Slave1 ~]# mysql < /data/all.sql
6.查看下slave status

[root@Slave1 ~]# mysql -e "SHOW SLAVE STATUS\G;"
1. row
Slave_IO_State:
Master_Host: 192.168.73.111
Master_User: repluser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000004
Read_Master_Log_Pos: 245
Relay_Log_File: mariadb-relay-bin.000001
Relay_Log_Pos: 4
Relay_Master_Log_File: mysql-bin.000004
Slave_IO_Running: No
Slave_SQL_Running: No
7.啓動線程

[root@Slave1 ~]# mysql -e "START SLAVE;"
8.再次查看slave status

[root@Slave1 ~]# mysql -e "show slave status\G;"
1. row
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.73.111
Master_User: repluser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000004
Read_Master_Log_Pos: 245
Relay_Log_File: mariadb-relay-bin.000002
Relay_Log_Pos: 529
Relay_Master_Log_File: mysql-bin.000004
Slave_IO_Running: Yes #線程已經全部啓動
Slave_SQL_Running: Yes
測試
在主節點上刪除hellodb庫中的teachers表

[root@Master ~]# mysql -e "SHOW TABLES FROM hellodb;" #先查看下庫是否有teachers表
+-------------------+
| Tables_in_hellodb |
+-------------------+
| classes |
| coc |
| courses |
| scores |
| students |
| teachers |
| toc |
+-------------------+
[root@Master ~]# mysql -e "DROP TABLE hellodb.teachers;" #刪表
[root@Master ~]# mysql -e "SHOW TABLES FROM hellodb;" #再次確認表是否刪除
+-------------------+
| Tables_in_hellodb |
+-------------------+
| classes |
| coc |
| courses |
| scores |
| students |
| toc |
+-------------------+
在slave1節點上查看是否同步

[root@Slave1 ~]# mysql -e "SHOW TABLES FROM hellodb;" #查看從節點是否還存在teachers表
+-------------------+
| Tables_in_hellodb |
+-------------------+
| classes |
| coc |
| courses |
| scores |
| students |
| toc |
+-------------------+
級聯複製配置成功

MySQL半同步複製
MySQL的複製方法有異步複製,同步複製,半同步複製。
異步複製
異步複製是當用戶寫入一條記錄時,先將數據寫入到主節點,然後回覆用戶一個寫入成功的消息,然後慢慢的將數據複製到其背後的其他從節點,這樣的好處是效率比較高,但是缺點也是非常明顯,主服務器和從服務器的延遲過大並且主服務器突然發生異常,此時就會造成數據的丟失。
同步複製
同步複製是當用戶寫入一條記錄時,主節點將數據寫入數據庫,然後將數據複製給其後面的其他從節點,當所有的從節點返回數據複製成功後,主節點再回復用戶數據接入成功的消息,這樣做的好處是,確保了數據的安全性,但損失了效率。
半同步複製
半同步複製是間於同步複製和異步複製之間的一種複製方法,他的工作原理是:當用戶執行寫操作時,主節點會將數據發送給其後面的其他從節點,只要有一個從節點返回複製成功的消息,主節點就直接返回寫入成功,如果主節點背後的從節點遲遲不返回複製成功消息,此時就會有一個超時時長,一旦達到超時時長,主節點就先返回消息告訴用戶複製成功,而後將數據繼續給從節點複製。

同步複製的配置方法
半同步複製要實現方法
主服務器上安裝semi_sync_master.so的插件,並啓用,設置好超時的時長
從服務器上安裝semi_sync_slave.so的插件,並啓用

以下以兩臺主機來演示半同步複製的配置方法

主機  ip
Master  192.168.73.110
Slave   192.168.73.111

一、配置主從

Master配置
1.修改MySQL配置文件

[root@Master ~]# vim /etc/my.cnf
[mysqld]
log-bin
binlog-format=row
server-id=1
2.啓動服務

[root@Master ~]# systemctl  start mariadb
3.查看二進制日誌位置

[root@Master ~]# mysql -e "SHOW MASTER LOGS;"
+--------------------+-----------+
| Log_name           | File_size |
+--------------------+-----------+
| mariadb-bin.000001 |       245 |
+--------------------+-----------+
4.創建一個用戶用來做主從複製

[root@Master ~]# mysql -e "GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'192.168.73.%' IDENTIFIED BY 'centos';"

Slave配置
1.修改MySQL配置文件

[root@Slave ~]# vim /etc/my.cnf
[mysqld]
log-bin
binlog-format=row
server-id=2
read_only
2.啓動服務

[root@Slave ~]# systemctl start mariadb
3.寫入CHANGE MASTER TO

MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='192.168.73.110', MASTER_USER='repluser',MASTER_PASSWORD='centos',MASTER_PORT=3306,MASTER_LOG_FILE='mariadb-bin.000001',MASTER_LOG_POS=245;
Query OK, 0 rows affected (0.01 sec)
4.啓動複製線程

MariaDB [(none)]> START SLAVE;
Query OK, 0 rows affected (0.00 sec)
5.查看slave狀態

MariaDB [(none)]> SHOW SLAVE STATUS\G;
1. row
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.73.110
Master_User: repluser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mariadb-bin.000001
Read_Master_Log_Pos: 521
Relay_Log_File: mariadb-relay-bin.000003
Relay_Log_Pos: 531
Relay_Master_Log_File: mariadb-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
測試

1.Master導入數據庫

[root@Master ~]# mysql < hellodb_innodb.sql 
[root@Master ~]# mysql -e "SHOW DATABASES;"
+--------------------+
| Database           |
+--------------------+
| information_schema |
| hellodb            |
| mysql              |
| performance_schema |
| test               |
+--------------------+
2.Slave查看庫

[root@Slave ~]# mysql -e "SHOW DATABASES;"
+--------------------+
| Database           |
+--------------------+
| information_schema |
| hellodb            |
| mysql              |
| performance_schema |
| test               |
+--------------------+
主從同步配置成功,接下來配置半同步
配置半同步前先將主從複製關閉

[root@Slave ~]# mysql -e "STOP SLAVE;"

二、配置半同步

Master節點配置
1.在Master節點上安裝semisync_master.so的插件

MariaDB [(none)]> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
Query OK, 0 rows affected (0.01 sec)
2.查看插件是否已經安裝

MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE '%semi%';
+------------------------------------+-------+
| Variable_name                      | Value |
+------------------------------------+-------+
| rpl_semi_sync_master_enabled       | OFF   |          #插件是否啓用
| rpl_semi_sync_master_timeout       | 10000 |          #半同步的超時時長
| rpl_semi_sync_master_trace_level   | 32    |          #用於開啓半同步複製模式時的調試級別
| rpl_semi_sync_master_wait_no_slave | ON    |          #是否允許master 每個事物提交後都要等待slave的receipt信號
+------------------------------------+-------+
4 rows in set (0.00 sec)
3.修改配置文件啓用插件

[root@Master ~]# vim /etc/my.cnf
[mysqld]
log-bin
binlog-format=row
server-id=1
rpl_semi_sync_master_enabled                    #啓用插件
4.重啓服務,查看插件是否啓動

[root@Master ~]# systemctl restart mariadb
[root@Master ~]# mysql -e "SHOW VARIABLES LIKE '%semi%'";
+------------------------------------+-------+
| Variable_name                      | Value |
+------------------------------------+-------+
| rpl_semi_sync_master_enabled       | ON    |  #已經啓動
| rpl_semi_sync_master_timeout       | 10000 |
| rpl_semi_sync_master_trace_level   | 32    |
| rpl_semi_sync_master_wait_no_slave | ON    |
+------------------------------------+-------+
5.設置超時時長

MariaDB [(none)]> SET GLOBAL rpl_semi_sync_master_timeout=3000;     #此處爲了方便後續測試將超時時間設置爲3秒
Query OK, 0 rows affected (0.00 sec)

Slave節點配置

1.在Slave節點上安裝semisync_slave.so插件

MariaDB [(none)]> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
Query OK, 0 rows affected (0.00 sec)
2.查看插件是否已經安裝

MariaDB [(none)]> SHOW VARIABLES LIKE "%semi%";
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled     | ON    |
| rpl_semi_sync_slave_trace_level | 32    |
+---------------------------------+-------+
2 rows in set (0.00 sec)
3.修改配置文件啓用插件

[root@Slave ~]# vim /etc/my.cnf
[mysqld]
log-bin
binlog-format=row
server-id=2
read_only
rpl_semi_sync_slave_enabled
4.重啓服務,查看插件是否啓動

[root@Slave ~]# mysql -e "SHOW VARIABLES LIKE '%semi%'";
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled     | ON    |
| rpl_semi_sync_slave_trace_level | 32    |
+---------------------------------+-------+
5.啓動複製線程

[root@Slave ~]# mysql -e "START SLAVE";

檢查

1.查看主節點的狀態,由於沒有複製過數據所有數據都爲空

MariaDB [(none)]> SHOW GLOBAL STATUS LIKE '%semi%';
+--------------------------------------------+-------+
| Variable_name                              | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients               | 1     |
| Rpl_semi_sync_master_net_avg_wait_time     | 0     |
| Rpl_semi_sync_master_net_wait_time         | 0     |
| Rpl_semi_sync_master_net_waits             | 0     |
| Rpl_semi_sync_master_no_times              | 0     |
| Rpl_semi_sync_master_no_tx                 | 0     |
| Rpl_semi_sync_master_status                | ON    |
| Rpl_semi_sync_master_timefunc_failures     | 0     |
| Rpl_semi_sync_master_tx_avg_wait_time      | 0     |
| Rpl_semi_sync_master_tx_wait_time          | 0     |
| Rpl_semi_sync_master_tx_waits              | 0     |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0     |
| Rpl_semi_sync_master_wait_sessions         | 0     |
| Rpl_semi_sync_master_yes_tx                | 0     |
+--------------------------------------------+-------+
14 rows in set (0.00 sec)
2.查看從節點的狀態
MariaDB [(none)]> SHOW GLOBAL STATUS LIKE '%semi%';
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | ON |
+----------------------------+-------+
1 row in set (0.00 sec)

測試
1.將從節點網路掐斷

[root@Slave ~]# ifdown ens33
2.在主節點添加一條記錄

MariaDB [(none)]> INSERT hellodb.teachers VALUE (5,'Tang San',20,'M');
Query OK, 1 row affected (3.00 sec)        
由於無法複製到從服務器,3秒後超時回覆用戶寫入成功

MySQL的高可用(MHA)
MHA簡介
MHA:Master High Availability,對主節點進行監控,可實現自動故障轉移至其他從節點;通過提升某一從節點爲新的主節點,基於主從複製實現,還需要客戶端配合實現,目前MHA主要支持一主二從,即一臺充當master,一臺充當備用master,另外一臺充當從數據庫,出於機器成本的考慮,淘寶進行了改造,目前淘寶TMHA已經一主一從。

MHA是由一臺manager服務器遠程監控主服務器,當主服務器掛了提升一臺從服務器作爲主服務器。
當主節點掛了,manager首先要查看哪臺從節點,同步的數據最多,然後提升同步最多的從節點爲主節點,再將其餘的MySQL服務器對他做從節點。
如果原主節點沒徹底死透,manager會讓新的主機通過ssh協議遠程連接到原先的主節點,拉取二進制日誌進行同步。如果主節死透了那就放棄。

MHA搭建
環境準備
一、準備4臺主機,管理節點1臺,主節點MySQL服務器1臺,從節點MySQL服務器2臺

主機  IP
Manager 192.168.73.111
Master  192.168.73.110
Slave1  192.168.73.112
Slave2  192.168.73.113

二、將Manager管理節點配置爲時間服務器,向所有MySQL服務器提供時間同步。

1.安裝chrony服務

[root@Manager ~]# yum install -y chrony
2.修改chrony配置文件

[root@Manager ~]# vim /etc/chrony.conf 
server 172.22.0.1 iburst
allow 192.168.0.0/16
local stratum 10
3.啓動chrony服務

[root@Manager ~]# systemctl start chronyd
4.將MySQL服務器與Manager服務器進行時間同步
4.1在所有MySQL主機上修改配置文件並啓動,並啓動服務

[root@Master ~]# sed -i '/^server 0/i server 192.168.73.111 iburst' /etc/chrony.conf
[root@Master ~]# systemctl start chronyd
4.2確認時間同步

[root@Master ~]# chronyc sources -v
210 Number of sources = 1

.-- Source mode  '^' = server, '=' = peer, '#' = local clock.
/ .- Source state '*' = current synced, '+' = combined , '-' = not combined,
| /   '?' = unreachable, 'x' = time may be in error, '~' = time too variable.
||                                                 .- xxxx [ yyyy ] +/- zzzz
||      Reachability register (octal) -.           |  xxxx = adjusted offset,
||      Log2(Polling interval) --.      |          |  yyyy = measured offset,
||                                \     |          |  zzzz = estimated error.
||                                 |    |           \
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^* 192.168.73.111                4   6   377    54    +25us[  +41us] +/-  105ms

三、配置ssh爲的密鑰認證登陸

當主節點宕機,manager會讓從節點通過ssh協議去嘗試連接主節點,並拉取二進制日誌,所以要時用密鑰的認證方式讓從節點登陸到主節點拉取數據。
1.在manager服務器上生成私鑰文件

[root@Manager ~]# ssh-keygen 
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:yAvC2PJUlRyAf1udlrVXzmIsUljTdUdW6X6FVpQ3Ajo root@Manager
The key's randomart image is:
+---[RSA 2048]----+
|   ..ooo   ++. +%|
|  .  .o   o oo.=*|
|   ..    E = oo*o|
| + ...... B o B.+|
|o = ..ooS. . =...|
| + . ...       ..|
|  .   .         .|
|                 |
|                 |
+----[SHA256]-----+
2.將公鑰文件複製給自己

[root@Manager ~]# ssh-copy-id 127.0.0.1
3.將整個~/.ssh目錄複製給所有的MySQL主機

[root@Manager ~]# scp -r ~/.ssh 192.168.73.110:/root

至此所有環境準備完畢

一、配置主從複製

主節點配置

1.修改配置文件

[root@Master ~]# vim /etc/my.cnf
[mysqld]
server-id=1
log-bin
binlog-format=row
skip_name_resolve
2.啓動數據庫服務

[root@Master ~]# systemctl start mariadb
3.創建主從複製賬號

[root@Master ~]# mysql -e "GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'192.168.73.%' IDENTIFIED BY 'centos';"
4.添加mha的管理賬號,讓管理節點遠程連接到主機用來設置主從調整

[root@Master ~]# mysql -e "GRANT ALL ON *.* TO 'mhauser'@'192.168.73.%' IDENTIFIED BY 'centos';"

從節點配置

1.修改配置文件

[root@Slave1 ~]# vim /etc/my.cnf
[mysqld]
server-id=2
read-only
log-bin
relay_log_purge=0
skip_name_resolve
2.啓動服務

[root@Slave1 ~]# systemctl start mariadb
3.配置CHANGE MASTER TO

MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='192.168.73.110', MASTER_USER='repluser',MASTER_PASSWORD='centos',MASTER_PORT=3306,MASTER_LOG_FILE='mariadb-bin.000001',MASTER_LOG_POS=245;
Query OK, 0 rows affected (0.00 sec)
4.啓動線程

MariaDB [(none)]> START SLAVE;
Query OK, 0 rows affected (0.00 sec)
在Slave2節點上也執行相同的操作,此處步驟省略,需要注意server-id需要修改爲和其他主從節點不同

5.測試 
主節點導入hellodb庫

[root@Master ~]# mysql < hellodb_innodb.sql
從節點查看是否同步
slave1

[root@Slave1 ~]# mysql -e "SHOW DATABASES;"
+--------------------+
| Database           |
+--------------------+
| information_schema |
| hellodb            |
| mysql              |
| performance_schema |
| test               |
+--------------------+

Slave2

[root@Slave2 ~]# mysql -e "SHOW DATABASES;"
+--------------------+
| Database           |
+--------------------+
| information_schema |
| hellodb            |
| mysql              |
| performance_schema |
| test               |
+--------------------+

二、配置管理節點及被管理節點

1.在管理節上安裝mha4mysql-manager、mha4mysql-node,將兩個包放在同一目錄下

[root@Manager ~]# yum install *.rpm -y  #這兩個包有依賴管理需要一起安裝
2.在所有被管理節點上安裝mha4mysql-node

[root@Master ~]# yum install mha4mysql-node-0.56-0.el6.noarch.rpm -y
[root@Slave1 ~]# yum install mha4mysql-node-0.56-0.el6.noarch.rpm -y
[root@Slave2 ~]# yum install mha4mysql-node-0.56-0.el6.noarch.rpm -y
3.在管理節點上創建配置文件

[root@Manager ~]# vim /etc/mha/aap1.conf

[server default] 
user=mhauser 
password=centos
manager_workdir=/data/mastermha/app1/ 
manager_log=/data/mastermha/app1/manager.log 
remote_workdir=/data/mastermha/app1/ 
ssh_user=root 
repl_user=repluser 
repl_password=centos
ping_interval=1

[server1] 
hostname=192.168.73.110
candidate_master=1 
[server2] 
hostname=192.168.73.112
candidate_master=1 
[server3]
hostname=192.168.73.113
candidate_master=1 
4.做檢查
4.1檢查ssh連接

[root@Manager ~]# masterha_check_ssh --conf=/etc/mha/aap1.conf 
4.2檢查主從複製

[root@Manager ~]# masterha_check_repl --conf=/etc/mha/aap1.conf 
5.以上兩項全部成功後啓動程序
mha這個程序是跑在前臺的,一次性的可以使用nohub或screen來解決跑在前臺的問題

[root@Manager ~]# masterha_manager --conf=/etc/mha/aap1.conf

三、測試

1.在master上跑個存儲過程,導入存儲過程

[root@Master ~]# mysql hellodb < testlog.sql 
2.調用存儲過程

MariaDB [(none)]> USE hellodb
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariaDB [hellodb]> call pro_testlog;
3.另起一個主節點窗口將主節點斷網

[root@Master ~]# ifdown ens33
4.manager端完成切換退出,查看日誌,查看新的主節點是哪臺slave

[root@Manager app1]# tail /data/mastermha/app1/manager.log

Started automated(non-interactive) failover.
The latest slave 192.168.73.112(192.168.73.112:3306) has all relay logs for recovery.
Selected 192.168.73.112(192.168.73.112:3306) as a new master.
192.168.73.112(192.168.73.112:3306): OK: Applying all logs succeeded.
192.168.73.113(192.168.73.113:3306): This host has the latest relay log events.
Generating relay diff files from the latest slave succeeded.
192.168.73.113(192.168.73.113:3306): OK: Applying all logs succeeded. Slave started, replicating from 192.168.73.112(192.168.73.112:3306)
192.168.73.112(192.168.73.112:3306): Resetting slave info succeeded.
Master failover to 192.168.73.112(192.168.73.112:3306) completed successfully.
#此處顯示最新的主節點爲192.168.73.112
由於從節點在配置文件中定義的爲read-only,此時被提升爲主能執行寫操作時應爲管理服務器上有管理賬號,他將從節點的服務器全局變量read_only給關閉了

[root@Slave1 ~]# mysql -e "SELECT @@read_only;"
+-------------+
| @@read_only |
+-------------+
|           0 |
+-------------+
爲了防止服務服務重啓再次變爲read-only,此時需要對新主節點的配置文件進行修改將read-only行註釋

[mysqld]
server-id=2
#read-only
log-bin
relay_log_purge=0
skip_name_resolve

四、測試新的主節點

1.對hellodb.teachers表插入數據

[root@Slave1 ~]# mysql -e "INSERT hellodb.teachers VALUES(5,'Tang San',30,'M');"
2.Slave2主機上查看是否同步

[root@Slave2 ~]# mysql -e "SELECT * FROM hellodb.teachers;"
+-----+---------------+-----+--------+
| TID | Name          | Age | Gender |
+-----+---------------+-----+--------+
|   1 | Song Jiang    |  45 | M      |
|   2 | Zhang Sanfeng |  94 | M      |
|   3 | Miejue Shitai |  77 | F      |
|   4 | Lin Chaoying  |  93 | F      |
|   5 | Tang San      |  30 | M      |    #已經同步
+-----+---------------+-----+--------+

其他事項
當原主節點被修復後,將其添加爲從節點使用。

MySQL高可用(Galera Cluster)

Galera Cluster簡介
Galera Cluster是集成了Galera插件的MySQL集羣,是一種新型的,數據不共享的,高度冗餘的高可用方案,目前Galera Cluster有兩個版本,分別是Percona Xtradb Cluster和MariaDB Cluster,Galera本時是具有多主特性,即採用Multi-master的集羣架構,是一個即穩健,又在數據一致性、完整性及高性能方面有出色表現的高可用解決方案

Galera Cluster特點
1.多主架構:真正的多點讀寫的集羣,在任何時候讀寫數據都是最新的
2.同步複製:集羣不同節點之間數據同步,沒有延遲,在數據庫掛掉之後,數據不會丟失
3.併發複製:從節點APPLY數據時,支持並行執行有更好的性能。
4.故障切換:數據庫故障時,因爲支持多點寫入,切換容易
5.熱插拔:在服務期間,如果數據庫掛了,只要監控程序發現的夠快,不可服務的時間就會非常少。在節點故障期間,節點本身對集羣的影響非常小
6.自動節點克隆: 在新增節點,或者停機維護時,增量數據或者基礎數據不需要人工手動備份提供,Galera Cluster會自動拉取在線節點數據,最終集羣會變爲一直
7.對應用透明:集羣的維護,對應用程序是透明的

Galera Cluster搭建

環境準備

準備3臺msyql服務器

主機名 ip地址
node1   192.168.73.110
node2   192.168.73.111
node3   192.168.73.11

一、配置YUM源
在每個節點上配置YUM源

[root@node1 ~]# vim /etc/yum.repos.d/mysql.repo
[mysql]
name=galera cluster
baseurl=http://mirrors.neusoft.edu.cn/mariadb//mariadb-10.0.38/yum/centos7-amd64/
gpgcheck=0
二、安裝MariaDB-Galera-server
在每個節點上安裝MariaDB-Galera-server

[root@node1 ~]# yum install MariaDB-Galera-server -y
三、修改配置文件
配置文件在/etc/my.cnf.d/server.cnf,有必須設置和可選設置兩個配置

# Mandatory settings                    #這裏的項目爲必填
wsrep_provider=                         #添加模塊路徑
wsrep_cluster_address=                  #添加所有服務器的地址gcomm服務器間代替通訊協議
binlog_format=row                       #啓用二進制日誌

# Optional setting                      #以下項爲可選項
#wsrep_slave_threads=1
#innodb_flush_log_at_trx_commit=0
#wsrep_cluster_name='testcluster'       #集羣的名稱
#wsrep_node_name='node1'                #當前節點的名稱
#wsrep_node_address='192.168.73.110'    #當前節點的地址
對每個節點配置文件進行修改,此處以node1爲例

[root@node1 ~]# vim /etc/my.cnf.d/server.cnf 
[galera]
# Mandatory settings
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_address="gcomm://192.168.73.110,192.168.73.111,192.168.73.112"
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0
四、啓動服務
第一個啓動的節點需要添加--wsrep-new-cluster選項,說明這是一個新的集羣,其餘節點啓動服務無需添加參數

[root@node1 ~]# service mysql start --wsrep-new-cluster
node2節點啓動服務

[root@node2 ~]# service mysql start
node3節點啓動服務

[root@node3 ~]# service mysql start
五、測試
1.測試同步
從node1導入數據庫

[root@node1 ~]# mysql < hellodb_innodb.sql 
node2查看

[root@node2 ~]# mysql -e "SHOW DATABASES;"
+--------------------+
| Database           |
+--------------------+
| hellodb            |
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
node3查看

[root@node3 ~]# mysql -e "SHOW DATABASES;"
+--------------------+
| Database           |
+--------------------+
| hellodb            |
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
2.測試衝突
同時在3節點創建表
在node2節點成功,其餘節點都失敗

[root@node2 ~]# mysql -e "CREATE TABLE hellodb.test(id int auto_increment primary key,name char(20));"
[root@localhost ~]# 
node1節點

[root@node1 ~]# mysql -e "CREATE TABLE hellodb.test(id int auto_increment primary key,name char(20));"
ERROR 1050 (42S01) at line 1: Table 'test' already exists
node3節點

[root@node3 ~]# mysql -e "CREATE TABLE hellodb.test(id int auto_increment primary key,name char(20));"
ERROR 1050 (42S01) at line 1: Table 'test' already exists
其他
Galera Cluster系統和狀態變量
1.查看狀態變量:SHOW STATUS LIKE 'wsrep_%'

MariaDB [(none)]> SHOW STATUS LIKE 'wsrep_%';
+------------------------------+-------------------------------------------------------------+
| Variable_name                | Value                                                       |
+------------------------------+-------------------------------------------------------------+
| wsrep_local_state_uuid       | e9f07cd3-7253-11e9-b27e-174ea2b4587d                        |
| wsrep_protocol_version       | 9                                                           |
| wsrep_last_committed         | 38                                                          |
| wsrep_replicated             | 36                                                          |
| wsrep_replicated_bytes       | 18960                                                       |
| wsrep_repl_keys              | 144                                                         |
| wsrep_repl_keys_bytes        | 2016                                                        |
| wsrep_repl_data_bytes        | 14522                                                       |
| wsrep_repl_other_bytes       | 0                                                           |
| wsrep_received               | 12                                                          |
| wsrep_received_bytes         | 1782                                                        |
| wsrep_local_commits          | 6                                                           |
| wsrep_local_cert_failures    | 0                                                           |
| wsrep_local_replays          | 0                                                           |
| wsrep_local_send_queue       | 0                                                           |
| wsrep_local_send_queue_max   | 1                                                           |
| wsrep_local_send_queue_min   | 0                                                           |
| wsrep_local_send_queue_avg   | 0.000000   
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章