1. 程式人生 > 資料庫 >MYSQL 完全備份、主從複製、級聯複製、半同步小結

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,同步完成

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。