1. 程式人生 > >Window環境下配置MySQL 5.6的主從復制、備份恢復

Window環境下配置MySQL 5.6的主從復制、備份恢復

end inf content 復制 grant -h 正常的 mysql 5.6 出現

原文:Window環境下配置MySQL 5.6的主從復制、備份恢復

1、環境準備

  • Windows 7 64位
  • MySQL 5.6
  • 主庫:192.168.103.207
  • 從庫:192.168.103.208
  • navicat無法連接MySQL8解決方案
    #修改加密規則
    ALTER USER root123@% IDENTIFIED BY root123 PASSWORD EXPIRE NEVER; 
    #更新密碼(mysql_native_password模式)   
    ALTER USER root123@% IDENTIFIED WITH mysql_native_password BY 
    root123;

2、配置新數據庫的主從復制

2.1、修改主庫配置文件

先在主數據庫中創建新數據庫rep_test。

然後編輯主數據庫的 my.ini 文件

[mysqld] 節點中增加或修改如下內容:

server-id=1 #指定唯一的ID,1至32,必須的
log-bin=mysql-log-bin #指定二進制日誌存放路徑,必須的
binlog-do-db=rep_test #指定要同步的數據庫,必須的
#binlog-ignore-db=mysql #指定不要同步的數據庫,如果指定了binlog-do-db就不用再指定該項

2.2、配置主庫備份賬戶

重啟主數據庫,然後在主數據庫中建立一個備份賬戶

mysql>grant replication slave on *.* to slave@192.168.103.208 identified by slave123 ;
mysql>flush privileges;

PS:identified by 指定的slave是賬號[email protected] 的密碼

2.3、查看主服務器狀態

顯示主服務器的狀態信息,並且找到File 和 Position 的值記錄下來;

mysql>show master status;

技術分享圖片

2.4、修改從庫配置文件

在從數據庫中創建新的數據庫rep_test。

然後編輯從數據庫的 my.ini 文件

[mysqld] 節點中增加如下內容:

server-id=2 #指定唯一的ID,2至32,必須的,並且不能跟主數據庫一樣
replicate-do-db=rep_test #指定要同步的數據庫,必須的
#replicate-ignore-db=mysql #指定不要同步的數據庫,

2.5、設置從庫slave

重啟從數據庫,設置登錄主數據庫的賬號和密碼等信息,然後啟動slave

mysql>change master to master_host=192.168.103.207,master_port=3307,master_user=slave,master_password=slave123, master_log_file=mysql-log-bin.000001,master_log_pos=407; 
mysql>start slave;

2.6、查看從數據庫的信息

mysql>show slave status \G;

如果出現: Slave_IO_Running: Yes Slave_SQL_Running: Yes以上兩項都為Yes,那說明沒問題了

技術分享圖片

2.7、測試主從復制

在主數據庫中創建一個新的表,然後再切換到從數據庫查看是否同樣多出同名的數據庫

技術分享圖片

2.8、清除主從關系

mysql主從復制中,需要將主從復制關系清除,需要取消其從庫角色。這可通過執行 RESET SLAVE ALL 清除從庫的同步復制信息、包括連接信息和二進制文件名、位置。從庫上執行這個命令後,使用show slave status將不會有輸出。

reset slave是各版本Mysql都有的功能,在stop slave之後使用。主要做:
刪除master.info和relay-log.info文件;
刪除所有的relay log(包括還沒有應用完的日誌),創建一個新的relay log文件;
從Mysql 5.5開始,多了一個all參數。如果不加all參數,那麽所有的連接信息仍然保留在內存中,包括主庫地址、端口、用戶、密碼等。這樣可以直接運行start slave命令而不必重新輸入change master to命令,而運行show slave status也仍和沒有運行reset slave一樣,有正常的輸出。但如果加了all參數,那麽這些內存中的數據也會被清除掉,運行show slave status就輸出為空了。
mysql>stop slave;
QueryOK, 0 rowsaffected (0,00 sec)

mysql>reset slave all;
QueryOK, 0 rowsaffected (0,04 sec)

mysql> show slave status\G
Emptyset (0,00 sec)

RESET MASTER

功能說明:刪除所有的binglog日誌文件,並將日誌索引文件清空,重新開始所有新的日誌文件。用於第一次進行搭建主從庫時,進行主庫binlog初始化工作;
測試如下:

未刪除前

[[email protected] mysql]# pwd
/usr/local/data/mysql
[[email protected] mysql]# ls
auto.cnf    client-cert.pem  ibdata1      ibtmp1                     localhost.localdomain.pid  mysql-bin.000002  mysql-bin.000005  mysqld_safe.pid     public_key.pem   sys
ca-key.pem  client-key.pem   ib_logfile0  imove                      mysql                      mysql-bin.000003  mysql-bin.000006  performance_schema  server-cert.pem
ca.pem      ib_buffer_pool   ib_logfile1  localhost.localdomain.err  mysql-bin.000001           mysql-bin.000004  mysql-bin.index   private_key.pem     server-key.pem
[[email protected] bin]# ./mysql -uroot -p123456
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000006 | 16663694 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
mysql> 

當前有6個binlong日誌,且Position的位置為16663694
運行RESET MASTER

mysql> reset master;
Query OK, 0 rows affected (0.03 sec)


mysql> show master status\G;
*************************** 1. row ***************************
            File: mysql-bin.000001
        Position: 107
    Binlog_Do_DB: 
Binlog_Ignore_DB: 
1 row in set (0.00 sec)

顯示所有的binlog已經被刪除掉,且binlog從000001 開始記錄

註:當數據庫要清理binlog文件的時候,可以通過操作系統進行刪除,也可以運行reset master進行刪除。但是如果當前是主數據庫,且主從數據庫正常的時候,千萬不能用這種方式刪除。

【使用場景】第一次搭建主從數據庫時,用於主庫的初始化binglog操作。

RESET SLAVE

功能說明:用於刪除SLAVE數據庫的relaylog日誌文件,並重新啟用新的relaylog文件;
測試如下:

登錄從數據庫,未刪除前

mysql> show slave status\G;
*************************** 1\. row ***************************
               Slave_IO_State: Connecting to master
                  Master_Host: 192.168.47.167
                  Master_User: server
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000019
          Read_Master_Log_Pos: 12992

Relay_Log_File: mysql02-relay-bin.000004
                Relay_Log_Pos: 4

         Relay_Master_Log_File: mysql-bin.000019

當前relaylog為0004;
先停止slave,運行RESET MASTER

mysql> stop slave;        
Query OK, 0 rows affected (0.01 sec)        
mysql> reset slave;                
Query OK, 0 rows affected (0.04 sec)
mysql> show slave status\G;
*************************** 1\. row ***************************
               Slave_IO_State: 
                  Master_Host: 192.168.47.167
                  Master_User: server
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: 
          Read_Master_Log_Pos: 4

**   Relay_Log_File: mysql02-relay-bin.000001
                Relay_Log_Pos: 4**

RESET SLAVE將使SLAVE忘記主從復制關系的位置信息。該語句將被用於幹凈的啟動, 它刪除master.info文件和relay-log.info 文件以及所有的relay log 文件並重新啟用一個新的relaylog文件。

使用場景:當原來的主從關系被破壞之後,從庫經過重新初始化後直接連接會報 ERROR 1201的錯誤,運行reset slave後,重新配置主從連接就可以了;

3、配置舊數據庫的主從復制

3.1、修改主庫配置文件

如果一開始數據庫的架構不是主從復制,並且運行一段時間後已經有數據存在,那配置的方式略有不同。

在從數據庫中創建新的數據庫landclash。

編輯主數據庫的 my.ini 文件,使用以下內容:

server-id=1 #指定唯一的ID,1至32,必須的
log-bin=mysql-log-bin #指定二進制日誌存放路徑,必須的
binlog-do-db=landclash
#binlog-ignore-db=mysql #指定不要同步的數據庫,如果指定了binlog-do-db就不用再指定該項

配置主庫備份賬戶

mysql>grant replication slave on *.* to [email protected]192.168.103.208 identified by slave123 ;
mysql>flush privileges;

3.2、主數據庫中鎖定所有的表

重啟主數據庫,然後在主數據庫中鎖定所有的表

mysql>flush tables with read lock;

3.3、查看主服務器狀態

顯示主服務器的狀態信息,並且找到File 和 Position 的值記錄下來;

mysql>show master status;

技術分享圖片

3.4、數據拷貝

將主數據庫data目錄下需要做主從復制的數據庫的同名目錄拷貝到從數據庫的data目錄下

註意:拷貝的話也要拷貝 ibdata1 文件,不然會不顯示表結構

技術分享圖片

3.5、修改從庫配置文件

編輯從數據庫的 my.ini 文件,加上一下內容:

server-id=2 #指定唯一的ID,2至32,必須的,並且不能跟主數據庫一樣
replicate-do-db=landclash #指定要同步的數據庫,必須的
#replicate-ignore-db=mysql #指定不要同步的數據庫,

3.6、設置從庫slave

重啟從數據庫,因為主數據庫在重新配置my.ini後,日誌文件變成新的文件,所以需要再次設置登錄主數據庫的賬號和密碼等信息

mysql> stop slave;
mysql>change master to master_host=192.168.103.207,master_port=3307,master_user=slave123,master_password=slave123, master_log_file=mysql-log-bin.000001,master_log_pos=742; 
mysql>start slave;

技術分享圖片

3.7、查看從數據庫的信息

再次輸入查看從數據庫狀態的命令

mysql>show slave status \G;

我們看到紅框標註的地方跟之前做新數據庫主從復制不一樣了。

技術分享圖片

3.8、主數據庫解鎖

完成上述配置後,回到主數據庫,將表解鎖

mysql>unlock tables;

之後在主數據庫的修改就能同步到從數據庫上了。

4、數據庫備份

4.1備份腳本

  • sql備份 DataBackupSql.bat
    rem *******************************Code Start*****************************
    @echo off
    
    set "Ymd=%date:~,4%%date:~5,2%%date:~8,2%"
    "C:\Program Files\MySQL\MySQL Server 5.6\bin\mysqldump" -P3307 -uroot123 -proot123 landclash > c:\db_bak\landclash_%Ymd%.sql
    @echo on
    rem *******************************Code End*****************************
  • 文件備份 DataBackupFile.bat
    *******************************Code Start*****************************
    net stop mysql
    xcopy "C:\ProgramData\MySQL\MySQL Server 5.6\data\landclash\*.*" "c:\db_bak\landclash\%date:~0,10%\" /S /I
    xcopy "C:\ProgramData\MySQL\MySQL Server 5.6\data\ibdata1" "c:\db_bak\landclash\%date:~0,10%\" /S /I
    net start mysql
    *******************************Code End *****************************

4.2、增量備份

小量的數據庫可以每天進行完整備份,因為這也用不了多少時間,但當數據庫很大時,就不太可能每天進行一次完整備份了,這時候就可以使用增量備份。增量備份的原理就是使用了mysql的binlog誌。

1、首先做一次完整備份:

mysqldump -h192.168.103.207  -P3307 -uroot123 -proot123  --single-transaction  --master-data=2 test > test.sql

這時候就會得到一個全備文件 test.sql

在sql文件中我們會看到:
-- CHANGE MASTER TO MASTER_LOG_FILE=‘bin-log.000002‘, MASTER_LOG_POS=107;是指備份後所有的更改將會保存到bin-log.000002二進制文件中。
2、在test庫的t_student表中增加兩條記錄,然後執行 flush logs 命令。這時將會產生一個新的二進制日誌文件bin-log.000003,bin-log.000002則保存了全備過後的所有更改,既增加記錄的操作也保存在了bin-log.00002中。

3、再在test庫中的a表中增加兩條記錄,然後誤刪除t_student表和a表。a中增加記錄的操作和刪除表a和t_student的操作都記錄在bin-log.000003中。

自動增量備份腳本:

IncreaseDB.sql

flush logs;

DataBackupFile_IncreaseDB.bat

*******************************Code Start*****************************
"C:\Program Files\MySQL\MySQL Server 5.6\bin\mysql.exe" -P3307 -uroot123 -proot123 < "C:\Program Files\MySQL\MySQL Server 5.6\bin\IncreaseDB.sql"
*******************************Code End *****************************

4.3、恢復

1、首先導入全備數據

mysql -h192.168.103.207  -P3307 -uroot123 -proot123 < test.sql

也可以直接在mysql命令行下面用source導入

mysql>source "test.sql"

2、恢復bin-log.000002

mysqlbinlog bin-log.000002 |mysql -h192.168.103.207  -P3307 -uroot123 -proot123 

3、恢復部分 bin-log.000003

在general_log中找到誤刪除的時間點,然後更加對應的時間點到bin-log.000003中找到相應的position點,需要恢復到誤刪除的前面一個position點。

可以用如下參數來控制binlog的區間

--start-position 開始點 --stop-position 結束點

--start-date 開始時間 --stop-date 結束時間

找到恢復點後,既可以開始恢復。

mysqlbinlog mysql-bin.000003 --stop-position=208 |mysql -h192.168.103.207  -P3307 -uroot123 -proot123

Window環境下配置MySQL 5.6的主從復制、備份恢復