您好,登錄后才能下訂單哦!
MySQL8.0 異步復制方式有哪些?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
針對空庫、脫機、聯機三種方式,配置一主兩從的mysql標準異步復制。只做整服務器級別的復制,不考慮對個別庫表或使用過濾復制的情況。
實驗環境
[root@slave2 ~]# cat /etc/hosts 192.168.2.138 master 192.168.2.192 slave1 192.168.2.130 slave2 mysql> select version(); +-----------+ | version() | +-----------+ | 8.0.16 | +-----------+ 1 row in set (0.00 sec)
一、空庫
1.查看主庫二進制信息
mysql> show master status; +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000004 | 155 | | | | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)
2.在主庫上建立復制用戶
mysql> create user 'repl'@'%' identified with mysql_native_password by 'wwwwww'; Query OK, 0 rows affected (0.03 sec) mysql> grant replication client,replication slave on *.* to 'repl'@'%'; Query OK, 0 rows affected (0.04 sec) mysql> flush privileges; Query OK, 0 rows affected (0.00 sec)
3.在從庫創建主庫信息
mysql> stop slave; mysql> change master to master_host='192.168.2.138', master_port=3306, master_user='repl', master_password='wwwwww', master_log_file='mysql-bin.000004', master_log_pos=155; Query OK, 0 rows affected, 2 warnings (0.00 sec) mysql> start slave; Query OK, 0 rows affected (0.00 sec) mysql> show slave status\G
剛才我們并沒有在從庫上建立repl用戶,但由于create user語句是在起始位置點后執行的,因此可以正常復制到從庫,查詢mysql.user表即可確認。
sql> select * from mysql.user where user='repl'\G
二、脫機
如果數據庫已經存在應用數據,但允許一個可接受的脫機時間窗口做復制,這種場景下常用的做法是先直接將主庫的數據目錄整體拷貝到從庫,再啟動復制。具體步驟如下。
1.在master節點創建測試庫和測試表
CREATE DATABASE test; Query OK, 1 row affected (0.04 sec) mysql> USE test; Database changed mysql> CREATE TABLE t(id int(10)); Query OK, 0 rows affected (0.09 sec) mysql> INSERT INTO t VALUES (111); Query OK, 1 row affected (0.05 sec) mysql> INSERT INTO t VALUES (222); Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO t VALUES (333); Query OK, 1 row affected (0.00 sec)
2.在主庫創建復制用戶
mysql> create user 'repl'@'%' identified with mysql_native_password by 'wwwwww'; Query OK, 0 rows affected (0.03 sec) mysql> grant replication client,replication slave on *.* to 'repl'@'%'; Query OK, 0 rows affected (0.04 sec) mysql> flush privileges; Query OK, 0 rows affected (0.00 sec)
3.停止復制的所有實例,在master、slave1、slave2分別執行
[root@master ~]# ln -s /usr/local/mysql/bin/mysqladmin /usr/bin/mysqladmin [root@master ~]# mysqladmin -hlocalhost -uroot -pwwwwww shutdown
4.復制數據至slave1、slave2
[root@master data]# cd /data [root@master data]# scp -r mysql/ slave1:/data/ [root@master data]# scp -r mysql/ slave2:/data/
5.在slave1、slave2從庫執行命令,刪除auto.cnf文件
[root@slave1 mysql]# cd /data/mysql [root@slave1 mysql]# rm -rf auto.cnf [root@slave2 mysql]# cd /data/mysql [root@slave2 mysql]# rm -rf auto.cnf
6.重啟實例,在三個節點都需要執行
[root@master data]# service mysqld start Starting MySQL.. SUCCESS!
7.在主庫查看二進制日志
mysql> show master status; +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000005 | 155 | | | | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)
8.在slave1、slave2從庫執行命令
mysql> stop slave; Query OK, 0 rows affected (0.01 sec) mysql> change master to master_host='192.168.2.138', master_port=3306, master_user='repl', master_password='wwwwww', master_log_file='mysql-bin.000005', master_log_pos=155; Query OK, 0 rows affected, 2 warnings (0.02 sec) mysql> start slave; Query OK, 0 rows affected (0.03 sec) mysql> show slave status\G
9.在slave1、slave2從庫執行命令查看庫和表是否同步過來
mysql> use test; 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 mysql> show tables; +----------------+ | Tables_in_test | +----------------+ | t | +----------------+ 1 row in set (0.00 sec) mysql> select * from t; +------+ | id | +------+ | 111 | | 222 | | 333 | +------+ 3 rows in set (0.00 sec)
三、mysqldump聯機
脫機建立復制的需求太過理想化,大多數情況下,復制是被要求在不影響線上業務的情況下,聯機創建的,而且還要求對線上庫的影響越小越好。例如,復制過程化中對主庫加鎖會影響對主庫的訪問,因此通常是不被允許的。這種場景下有兩種備選的復制方案:使用mysqldump程序或使用如XtraBackup的第三方工具。這兩種方案有各自的適用場合。使用mysqldump聯機建立復制的過程如下。
1.在主庫創建測試的數據庫和表
mysql> CREATE DATABASE test; Query OK, 1 row affected (0.04 sec) mysql> use test; Database changed mysql> CREATE TABLE t(id int(10)); Query OK, 0 rows affected (0.10 sec) mysql> INSERT INTO t VALUES(111); Query OK, 1 row affected (0.09 sec) mysql> INSERT INTO t VALUES(222); Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO t VALUES(333); Query OK, 1 row affected (0.05 sec) mysql> INSERT INTO t VALUES(444); Query OK, 1 row affected (0.00 sec)
2.在主庫創建復制用戶
mysql> create user 'repl'@'%' identified with mysql_native_password by 'wwwwww'; Query OK, 0 rows affected (0.01 sec) mysql> grant replication client,replication slave on *.* to 'repl'@'%'; Query OK, 0 rows affected (0.01 sec) mysql> flush privileges; Query OK, 0 rows affected (0.01 sec)
3.在slave1、slave2從庫創建主庫信息
mysql> change master to master_host='192.168.2.138', master_port=3306, master_user='repl', master_password='wwwwww'; Query OK, 0 rows affected, 2 warnings (0.04 sec)
4.在slave1、slave2從庫使用mysqldump命令復制數據
[root@slave2 ~]# mysqldump --single-transaction --all-databases --master-data=1 --host=192.168.2.138 --user=root --password=wwwwww --apply-slave-statements | mysql -uroot -pwwwwww -hlocalhost mysql: [Warning] Using a password on the command line interface can be insecure. mysqldump: [Warning] Using a password on the command line interface can be insecure.
參數說明
–single-transaction參數可以對Innodb表執行非鎖定導出。此選項將事務隔離模式設置為REPEATABLE READ,并在轉儲數據之前向服務器發送START TRANSACTION SQL語句。它僅適用于Innodb等事務表,因為它會在發出START TRANSACTION時轉儲數據庫的一致狀態,而不會阻塞任何應用程序。因此這里假定:1. 所有的應用數據表都使用Innodb引擎。2. 所有系統表數據在備份過程中不會發生變化。
–master-data參數會導致轉儲輸出包含類似 CHANGE MASTER TO MASTER_LOG_FILE=‘binlog.000004', MASTER_LOG_POS=1480; 的SQL語句,該語句指示主庫的二進制日志坐標(文件名和位置)。如果選項值為2,則CHANGE MASTER TO語句將寫為SQL注釋,因此僅提供信息,不會執行。如果參數值為1,則該語句不會寫為注釋,并在重新加載轉儲文件時執行。如果未指定選項值,則默認值為1。
–apply-slave-statements參數會在CHANGE MASTER TO語句之前添加STOP SLAVE語句,并在輸出結尾處添加START SLAVE語句,用來自動開啟復制。
通過管道操作符,導出導入一步進行,不需要中間落盤生成文件。
5.在從庫確認復制狀態
mysql> show slave status\G
6.在從庫查看庫和表是否復制成功
use test; 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 mysql> select * from t; +------+ | id | +------+ | 111 | | 222 | | 333 | | 444 | | 555 | +------+ 5 rows in set (0.00 sec)
mysqldump方式的優點是可以進行部分復制,如在配置文件中定義replicate-do-table=db1.*,則用這種方法可以只復制db1庫而忽略其它復制事件。缺點是由于mysqldump會生成主庫轉儲數據的SQL語句,實際是一種邏輯備份方式所以速度較慢,不適用于大庫。
四、XtraBackup聯機復制
聯機建立復制的另一種可選方案是使用XtraBackup。XtraBackup是Percona公司的開源項目,用以實現類似Innodb官方的熱備份工具InnoDB Hot Backup的功能,它支持在線熱備份,備份時不影響數據讀寫。到目前為止,最新的版本為Percona XtraBackup 8.0.6,可以從https://www.percona.com/downloads/下載安裝包。XtraBackup有很多功能和優點,例如支持全備、增量備份、部分備份;支持壓縮備份;備份不影響數據讀寫、事務等,但是也有缺陷不足:例如不支持脫機備份、不支持直接備份到磁帶設備、不支持Cloud Back,MyISAM的備份也會阻塞。不過這些小瑕疵不影響XtraBackup成為一款流行的MySQL備份工具。另外,注意XtraBackup只支持Linux平臺,不支持Windows平臺。下面演示用XtraBackup聯機搭建主從復制的過程,主庫已經建立了用于執行復制的用戶repl。
在主庫創建復制用戶
mysql> create user 'repl'@'%' identified with mysql_native_password by 'wwwwww'; Query OK, 0 rows affected (0.01 sec) mysql> grant replication client,replication slave on *.* to 'repl'@'%'; Query OK, 0 rows affected (0.01 sec) mysql> flush privileges; Query OK, 0 rows affected (0.01 sec)
1.在主庫和從庫都安裝XtraBackupv
[root@master ~]# yum -y install libev [root@master home]# yum localinstall percona-xtrabackup-80-8.0.6-1.el7.x86_64.rpm -y
2.配置主庫到從庫的SSH免密碼連接
[root@master home]# 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:GBLbrw17UVck8RyCa/fbYyLkSNZIRc5p+jPQmpkD+bI root@master The key's randomart image is: +---[RSA 2048]----+ | . .o+o+ | | + +..* . | | o o o*. o | | . +.o*.. | | ooS+oo . | | =o=Bo . | | o.=B++ o | | .o..oo..o.| | E . o .| +----[SHA256]-----+ [root@master home]# ssh-copy-id 192.168.2.138 [root@master home]# ssh-copy-id 192.168.2.192 [root@master home]# ssh-copy-id 192.168.2.130
3.停止從庫,并刪除從庫里面的數據
[root@slave1 home]# service mysql stop [root@slave2 home]# service mysql stop [root@slave1 home]# rm -rf /data/mysql/* [root@slave2 home]# rm -rf /data/mysql/*
4.備份數據并傳輸
[root@master tmp]# xtrabackup -uroot -pwwwwww --socket=/data/mysql/mysql.sock --no-lock --backup --compress --stream=xbstream --parallel=4 --target-dir=./ | ssh root@192.168.2.192 "xbstream -x -C /data/mysql/ --decompress"
執行過程中報錯,
190606 01:21:47 >> log scanned up to (19597291)
190606 01:21:47 Selecting LSN and binary log position from p_s.log_status
Error: failed to fetch query result SELECT server_uuid, local, replication, storage_engines FROM performance_schema.log_status: Access denied; you need (at least one of) the BACKUP_ADMIN privilege(s) for this operation
mysql> grant BACKUP_ADMIN on *.* to 'root'@'%'; Query OK, 0 rows affected (0.01 sec)
行如下命令,刪除192.168.2.192:/data/mysql/*的內容,再次執行命令,發現已經正確了。成功執行如下所示:
這條命令連接主庫,進行并行壓縮流式備份,同時將備份通過管道操作符傳輸到從庫,并直接解壓縮到從庫的數據目錄。所有操作一條命令完成,不需要中間落盤生成文件。
5.在從庫恢復備份
[root@slave1 /]# xtrabackup --prepare --target-dir=/data/mysql [root@slave2 /]# xtrabackup --prepare --target-dir=/data/mysql
6.在從庫查看二進制bin-log日志
[root@slave1 mysql]# cat xtrabackup_binlog_info mysql-bin.000008 155 [root@slave2 mysql]# cat xtrabackup_binlog_info mysql-bin.000009 155
7.啟動從庫
[root@slave1 data]# service mysqld start Starting MySQL... SUCCESS! [root@slave2 data]# service mysqld start Starting MySQL... SUCCESS!
8.創建主庫信息,其中的master_log_file和master_log_pos值來自第6步
mysql> change master to master_host='192.168.2.138', master_port=3306, master_user='repl', master_password='wwwwww', master_log_file='mysql-bin.000008', master_log_pos=155; Query OK, 0 rows affected, 2 warnings (0.04 sec) mysql> start slave; Query OK, 0 rows affected (0.00 sec) mysql> show slave status\G
9.在從庫測試數據
mysql> use test; 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 mysql> select * from t; +------+ | id | +------+ | 111 | | 222 | | 333 | | 444 | | 555 | +------+ 5 rows in set (0.00 sec)
XtraBackup是物理復制,性能比mysqldump高的多,而且對主庫的影響極小,非常適用于從頭聯機創建高負載、大數據量、全實例從庫的場景。
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。