MYSQL 完全備份、主從複製、級聯複製、半同步小結
mysql 完全備份
1,啟用二進位制日誌,並於資料庫分離,單獨存放
vim /etc/my.cnf
新增
log_bin=/data/bin/mysql-bin
建立/data/bin資料夾並授權
chown mysql.mysql /data/bin
2,完成備份資料庫
mysqldump -A --single-transaction --master-data=2 | xz > /data/all.sql.xz
3,對資料庫進行增刪改
INSERT hellodb.students(stuid,name,gender,age) VALUE(27,'Lujunyi','M',30);
4,停止MySQL
systemctl stop mariadb.service
5,解壓備份檔案
unxz /data/all.sql.xz
6,查詢完全備份時二進位制日誌的位置
vim /data/all.sql HANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=468
7,匯出完成備份後的二進位制日誌
mysqlbinlog --start-position=468 /data/bin/mysql-bin.000001 > /data/inc.sql
8,還原資料
mysql -e 'source /data/all.sql' mysql -e 'source /data/inc.sql'
9,驗證完成。
誤刪除的恢復
1,啟用二進位制日誌並與資料庫分開存放
vim /etc/my.cnf
新增
log_bin=/data/bin/mysql-bin
建立/data/bin資料夾並授權
chown mysql.mysql /data/bin
2,對資料庫進行完全備份
mysqldump -A --single-transaction --master-data=2 | xz > /data/all.sql.xz
3,對資料庫進行增刪改
mysql -e "drop table hellodb.students" mysql -e "insert hellodb.teachers value (5,'wangqi',50,'M')"
4,停止服務
systemctl stop mariadb.service
5,刪除資料庫
rm -rf /var/lib/mysql/*
6,解壓備份檔案
unxz /data/all.sql.xz
7,檢視備份檔案,查詢二進位制節點
vim /data/all.sql -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000004',MASTER_LOG_POS=521902;
8,匯出二進位制日誌節點資料
mysqlbinlog --start-position=521902 /data/bin/mysql-bin.000004 >/data/inc.sql
9,刪除二進位制日誌節點資料中誤操作的命令
vim /data/inc.sql DROP TABLE `hellodb`.`students` /* generated by server */
10,啟動服務
systemctl start mariadb.service
11.關閉二進位制日誌記錄
mysql -e "SET sql_log_bin=off"
12,匯入備份資料
mysql </data/all.sql mysql </data/inc.sql
13,驗證完成。
主從複製
# 主伺服器
1,主伺服器啟用二進位制日誌,並更改二進位制目錄
vim /etc/my.cnf log_bin=/data/bin/mysql-bin binlog-format=row server-id=1(主從伺服器必需保證不同)
更改目錄見上面
2,重啟服務
service mysql restart
3,建立一個賬戶用來複制資料的賬戶
mysql -e 'GRANT REPLICATION SLAVE ON *.* TO "repluser"@"172.22.7.%" IDENTIFIED BY "centos"
4,檢視主伺服器正在使用的二進位制日誌
show master logs; +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000001 | 14383 | +------------------+-----------+ 1 row in set (0.00 sec)
# 從伺服器
5,更配置
vim /etc/my.cnf server-id=2 read-only #log-bin=/data/bin/mysql-bin
6,啟動服務
service mysql restart
7,關聯主服務
MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='172.22.7.70',MASTER_USER='repluser',MASTER_PASSWORD='centos',MASTER_PORT=3306,MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=14383;
8,檢視從伺服器狀態
show slave status\G;
9,啟動執行緒
start slave;
#測試
10,增刪改主伺服器資料,檢視從伺服器資料是否同步。
主從複製出錯的解決-sql_slave_skip_counter
#master服務 ip=172.22.7.70
1,主伺服器啟用二進位制日誌,並更改二進位制目錄
vim /etc/my.cnf log_bin=/data/bin/mysql-bin binlog-format=row server-id=1(主從伺服器必需保證不同)
更改目錄見上面
2,重啟服務
service mysql restart
3,建立一個賬戶用來複制資料的賬戶
mysql -e 'GRANT REPLICATION SLAVE ON *.* TO "repluser"@"172.22.7.%" IDENTIFIED BY "centos"
4,檢視主伺服器正在使用的二進位制日誌
mysql -e 'show master logs;' +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000001 | 264 | | mysql-bin.000002 | 245 | +------------------+-----------+
#slave服務 ip=172.22.7.71
5,修改配置檔案,啟動服務
vim /etc/my.cnf [mysqld] server-id = 2 read-only systemctl start mariadb
#配置錯誤master服務資訊
6,配置,change master to
CHANGE MASTER TO MASTER_HOST='172.22.7.77',MASTER_USER='wang',MASTER_PASSWORD='lodman',MASTER_LOG_FILE=log-bin.001',MASTER_LOG_POS=4,MASTER_CONNECT_RETRY=10;
7,檢視slave 狀態
mysql -e 'show slave status\G' Slave_IO_State: Master_Host: 172.22.7.77 Master_User: wang Master_Port: 3306 Connect_Retry: 10 Master_Log_File: log-bin.001 Read_Master_Log_Pos: 4 Relay_Log_File: ct7m1-relay-bin.000001 Relay_Log_Pos: 4 Relay_Master_Log_File: log-bin.001 Slave_IO_Running: No Slave_SQL_Running: No ·········略
8,啟動複製執行緒
mysql -e 'start slave'
9,再次檢視slave狀態
mysql -e 'show slave status\G' Slave_IO_State: Master_Host: 172.22.7.77 Master_User: wang Master_Port: 3306 Connect_Retry: 10 Master_Log_File: log-bin.001 Read_Master_Log_Pos: 4 Relay_Log_File: ct7m1-relay-bin.000001 Relay_Log_Pos: 4 Relay_Master_Log_File: log-bin.001 Slave_IO_Running: Connecting Slave_SQL_Running: Yes ·········略
10,master服務增刪改資料
11,檢視slave服務是否同步,失敗!
#解決錯誤
12,停止並重置slave複製執行緒服務
mysql -e 'stop slave' mysql -e 'reset slave'
13,配置正確的change master to 資訊
CHANGE MASTER TO MASTER_HOST='172.22.7.70',MASTER_LOG_FILE='mysql-bin.000002',MASTER_LOG_POS=245;
14,檢視slave狀態
show slave status\G; Slave_IO_State: Waiting for master to send event Master_Host: 172.22.7.70 Master_User: repluser Master_Port: 3306 Connect_Retry: 10 Master_Log_File: mysql-bin.000002 Read_Master_Log_Pos: 7382 Relay_Log_File: ct7m1-relay-bin.000002 Relay_Log_Pos: 540 Relay_Master_Log_File: mysql-bin.000002 Slave_IO_Running: Yes Slave_SQL_Running: No
15,發現slave狀態中Slave_SQL_Running: No ,執行下面命令更為為YES
MariaDB [(none)]> stop slave; Query OK,0 rows affected (0.00 sec) MariaDB [(none)]> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1; Query OK,0 rows affected (0.00 sec) MariaDB [(none)]> start slave; Query OK,0 rows affected (0.03 sec) MariaDB [(none)]> show slave status\G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 172.22.7.70 Master_User: repluser Master_Port: 3306 Connect_Retry: 10 Master_Log_File: mysql-bin.000002 Read_Master_Log_Pos: 7382 Relay_Log_File: ct7m1-relay-bin.000003 Relay_Log_Pos: 540 Relay_Master_Log_File: mysql-bin.000002 Slave_IO_Running: Yes Slave_SQL_Running: Yes ·········略
16,檢視slave服務資料是否同步
17,同步完成。
Mysql 級聯複製
在生產換進中有一種主從複製的方法主節點先將資料同步到一箇中間的從節點,然後由從節點給後續的其他從節點來複制資料,這種複製方式稱為級聯複製。
級聯複製的好處是可以極大的減輕主節點的壓力
級聯複製在配置時需要在中間節點上啟用log_slave_updates的選項。
#環境 伺服器 master slave slave 系統 centos7 centos7 centos7 ip 172.22.7.70 172.22.7.70 172.22.7.71
#mater
1,主伺服器啟用二進位制日誌,並更改二進位制目錄
vim /etc/my.cnf log_bin=/data/bin/mysql-bin binlog-format=row server-id=1(主從伺服器必需保證不同)
更改目錄見上面
2,重啟服務
service mysql restart
3,建立一個賬戶用來複制資料的賬戶
mysql -e 'GRANT REPLICATION SLAVE ON *.* TO "repluser"@"172.22.7.%" IDENTIFIED BY "centos"
4,檢視主伺服器正在使用的二進位制日誌
mysql -e 'show master logs;' +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000001 | 264 | | mysql-bin.000002 | 7488 | | mysql-bin.000003 | 402 | +------------------+-----------+ #slave
5,修改配置檔案,並建立二進位制日誌目錄
vim /etc/my.cnf [mysqld] log-bin=/data/bin/mysql-bin binlog-format=row read-only log_slave_updates server-id=2
更改目錄見上
6,啟動服務
systemctl restart mariadb
7,配置change master to資訊
CHANGE MASTER TO MASTER_HOST='172.22.7.70',MASTER_LOG_FILE='mysql-bin.000003',MASTER_LOG_POS=402;
8,啟動slave執行緒
mysql -e 'start slave'
9,檢視slave狀態
show slave status\G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 172.22.7.70 Master_User: repluser Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000003 Read_Master_Log_Pos: 7539 Relay_Log_File: ct7m1-relay-bin.000002 Relay_Log_Pos: 7677 Relay_Master_Log_File: mysql-bin.000003 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB:
10,在master上增刪改資料測試檢視
#slave1
11,在slave上將slave上的資料拷貝過來
mysqldump -A --single-transaction -F --master-data=1 > /data/all.sql scp /data/all.sql 172.22.7.72:/data
12,slave建立一個賬戶用來複制資料的賬戶
mysql -e 'GRANT REPLICATION SLAVE ON *.* TO "repluser"@"172.22.7.%" IDENTIFIED BY "centos"
13,修改slave1配置
vim /etc/my.cnf [mysqld] read-only server-id=3
14,啟動服務
systemctl start mariadb
15,檢視slave伺服器的二進位制日誌
mysql -e 'show master logs' +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000001 | 351 | | mysql-bin.000002 | 351 | | mysql-bin.000003 | 351 | | mysql-bin.000004 | 25552 | | mysql-bin.000005 | 586 | +------------------+-----------+
16,開啟all.sql檔案對change master on資訊加以修改
CHANGE MASTER TO MASTER_HOST='172.22.7.71',MASTER _PASSWORD='centos',MASTER_LOG_FILE='mysql-bin.000005',MASTER_LOG_POS=586;
17,匯入slave資料
mysql < /data/all.sql
18,啟動執行緒
mysql -e "START SLAVE;"
19,檢視slave狀態
mysql -e "show slave status\G;"
20,對master物件增刪改操作,檢視是否同步
21,同步完成。
MySQL半同步
非同步複製是當用戶寫入一條記錄時,先將資料寫入到主節點,然後回覆使用者一個寫入成功的訊息,然後慢慢的將資料複製到其背後的其他從節點,這樣的好處是效率比較高,但是缺點也是非常明顯,主伺服器和從伺服器的延遲過大並且主伺服器突然發生異常,此時就會造成資料的丟失。
同步複製是當用戶寫入一條記錄時,主節點將資料寫入資料庫,然後將資料複製給其後面的其他從節點,當所有的從節點返回資料複製成功後,主節點再回複用戶資料接入成功的訊息,這樣做的好處是,確保了資料的安全性,但損失了效率。
半同步複製是間於同步複製和非同步複製之間的一種複製方法,他的工作原理是:當用戶執行寫操作時,主節點會將資料傳送給其後面的其他從節點,只要有一個從節點返回複製成功的訊息,主節點就直接返回寫入成功,如果主節點背後的從節點遲遲不返回複製成功訊息,此時就會有一個超時時長,一旦達到超時時長,主節點就先返回訊息告訴使用者複製成功,而後將資料繼續給從節點複製。
#配置主從複製 步驟見上。
#配置半同步
##master
1,修改配置檔案啟用外掛
vim /etc/my.cnf [mysqld] log-bin=/data/bin/mariadb-bin binlog-format=row server-id=1 rpl_semi_sync_master_enabled
2,重啟服務,
systemctl restart mariadb
3,檢視外掛是否啟動
SHOW GLOBAL VARIABLES LIKE '%semi%'; +------------------------------------+-------+ | Variable_name | Value | +------------------------------------+-------+ | rpl_semi_sync_master_enabled | ON | | rpl_semi_sync_master_timeout | 3000 | | rpl_semi_sync_master_trace_level | 32 | | rpl_semi_sync_master_wait_no_slave | ON | +------------------------------------+-------+ 4 rows in set (0.00 sec)
4,設定超時時長
SET GLOBAL rpl_semi_sync_master_timeout=3000; Query OK,0 rows affected (0.00 sec)
##slave
5,修改配置檔案啟用外掛
vim /etc/my.cnf [mysqld] log-bin=/data/bin/mariadb-bin binlog-format=row server-id=2 rpl_semi_sync_master_enabled
6,重啟服務,
systemctl restart mariadb
7,檢視外掛是否啟動
SHOW GLOBAL VARIABLES LIKE '%semi%'; +------------------------------------+--------------+ | Variable_name | Value | +------------------------------------+--------------+ | rpl_semi_sync_master_enabled | ON | | rpl_semi_sync_master_timeout | 1000 | | rpl_semi_sync_master_trace_level | 32 | | rpl_semi_sync_master_wait_no_slave | ON | | rpl_semi_sync_master_wait_point | AFTER_COMMIT | +------------------------------------+--------------+ 5 rows in set (0.00 sec)
8,啟動複製執行緒
mysql -e "START SLAVE";
9,測試檢查
10,同步完成
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。