1、MySQL主從同步異步概念
成都創(chuàng)新互聯(lián)公司專注于企業(yè)網(wǎng)絡營銷推廣、網(wǎng)站重做改版、新鄉(xiāng)縣網(wǎng)站定制設計、自適應品牌網(wǎng)站建設、H5網(wǎng)站設計、購物商城網(wǎng)站建設、集團公司官網(wǎng)建設、成都外貿(mào)網(wǎng)站建設、高端網(wǎng)站制作、響應式網(wǎng)頁設計等建站業(yè)務,價格優(yōu)惠性價比高,為新鄉(xiāng)縣等各大城市提供網(wǎng)站開發(fā)制作服務。
異步:主服務器寫完日志后立即返回同步完成消息,不受從服務器的狀態(tài)和影響,mysql默認為異步工作模式
同步:主服務器寫入數(shù)據(jù)到本地磁盤并記錄好二進制日志,然后等從服務器發(fā)現(xiàn)數(shù)據(jù)發(fā)送改變再把數(shù)據(jù)同步到從服務器的日志中繼并保存到二進制日志和磁盤,最后返回給主服務器同步完成的結(jié)果,因此比較影響性能。
2、同步過程:
主 服務器在可能修改數(shù)據(jù)時會把行內(nèi)容記錄在二進制日志中,而從服務會不停到主服務器請求數(shù)據(jù),相當于mysql客戶端,不停請求服務器的3306端口,從服 務器請求到主服務器的日志先記錄到從服務器的中級日志下來,然后從服務器的本地線程讀取下來應用一次保存到從服務器的本地磁盤空間,從而達到與主服務器的 內(nèi)容一致的效果。
SLAVE:IO thread:向主服務器請求二進制日志中的事件
SQL thread:從中繼日志讀取事件并在本地執(zhí)行
MASTER:binglog dump:將IO thread的請求事件發(fā)送給對方
3、注意事項:
1、從服務器一定不能寫數(shù)據(jù),因為數(shù)據(jù)不會傳輸?shù)街鞣掌?/p>
2、主服務器有并且只能有一個主服務器,一般不支持一叢多主
3、mariadb-10 支持多主模型,即支持多源復制(mutil-source replication)
4、主從版本盡量相同,或從版本低于主版本
5、主從的server-id不能相同
4、配置過程:
1、主服務器:
1、改server-id
2、啟用二進制日志
3、創(chuàng)建有復制權(quán)限的賬號
2、從服務器
1、改server-id
2、啟用中繼日志
3、指向主服務器-使用主服務器創(chuàng)建的賬號和密碼
4、啟動復制進程
5、環(huán)境:
系統(tǒng):CentOS 6.5_x86_64
主IP:192.168.10.204
從IP:192.168.10.205
MariaDB版本:mariadb-10.0.15-linux-x86_64.tar.gz
一.新建主從結(jié)構(gòu),即主服務器沒有任何數(shù)據(jù)的情況下加入從服務器:
主服務器:
1、改server-id
[root@node4 binlogs]# vim /etc/mysql/my.cnf
server-id = 10
2、啟用二進制日志
log-bin=/data/binlogs/master-log
3、創(chuàng)建有復制權(quán)限的賬號
mysql> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'repluser'@'192.168.%.%' IDENTIFIED BY '123456';
Query OK, 0 rows affected (0.03 sec)
mysql> FLUSH PRIVILEGES; #刷新表
Query OK, 0 rows affected (0.00 sec)
4、重啟服務:
[root@node4 binlogs]# /etc/init.d/mysqld restart
Shutting down MySQL.. [ OK ]
Starting MySQL. [ OK ]
從服務器:
1、改server-id:
[root@node5 ~]# vim /etc/mysql/my.cnf
server-id = 100
2、關(guān)閉從服務器的二進制日志:
#log-bin=/data/binlogs/master-bin
relay-log = /data/relaylogs/relay-logs #指定從服務器的日志存放路徑
3、重啟服務: [root@node5 relaylogs]# /etc/init.d/mysqld restart
Shutting down MySQL.. [ OK ]
Starting MySQL. [ OK ]
4、查看從服務器狀態(tài):
mysql> show slave status\G;
*************************** 1. row***************************
Slave_IO_State: Waiting for master to sendevent
Master_Host: 192.168.10.204
Master_User: jack
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master-log.000008
Read_Master_Log_Pos: 1537
Relay_Log_File: relay-bin.000004
Relay_Log_Pos: 536
Relay_Master_Log_File: master-log.000008
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: 1537
Relay_Log_Space: 827
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: 10
Master_SSL_Crl:
Master_SSL_Crlpath:
Using_Gtid: No
Gtid_IO_Pos:
在主服務器創(chuàng)建數(shù)據(jù)庫,查看是否可以同步到從服務器:
主服務器:
mysql> create databases slave; #創(chuàng)建新的數(shù)據(jù)庫
mysql> show databases; #查看是否創(chuàng)建完成
+--------------------+
| Database |
+--------------------+
| hellodb |
| information_schema |
| mysql |
| performance_schema |
| s |
| slave |
| test |
+--------------------+
mysql> USE slave; #切換的創(chuàng)建的數(shù)據(jù)庫
Database changed
mysql> create table t1 (id int); #創(chuàng)建新的表
Query OK, 0 rows affected (0.07 sec)
mysql> INSERT INTO t1 VALUES (1),(2),(3); #向表插入簡單數(shù)據(jù)
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings:
mysql> select * from t1; #驗證數(shù)據(jù)是否成功寫入
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
+------+
3 rows in set (0.00 sec)
從服務器驗證:
mysql> show databases; #查看是否有主服務器創(chuàng)建的數(shù)據(jù)庫
+--------------------+
| Database |
+--------------------+
| hellodb |
| information_schema |
| mysql |
| performance_schema |
| s |
| slave |
| test |
+--------------------+
7 rows in set (0.07 sec)
mysql> use slave; #切換的主服務器的數(shù)據(jù)庫
Database changed
mysql> select * from t1; @查詢是否有主服務器表的信息
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
+------+
3 rows in set (0.00 sec)
二:主服務器運行中并且有一定的數(shù)據(jù)再加入從服務器:
此過程要先把主服務器的數(shù)據(jù)備份出來,然后拷貝到從服務器上導入到從服務器的數(shù)據(jù)庫,然后在讓從服務器從主服務器的指定位置開始備份數(shù)據(jù)即可。
主服務器導出數(shù)據(jù):
root@node4 binlogs]# /usr/local/mysql/bin/mysqldump --all-databases --flush-logs --master-data=2 --lock-tables > /backup.sql
[root@node4 binlogs]# scp /backup.sql 192.168.10.205:/
root@192.168.10.205's password:
backup.sql 100% 518KB 518.0KB/s 00:00
從服務器導入數(shù)據(jù):
[root@node5 relaylogs]# mysql < /backup.sql
mysql>CHANGE MASTER TOMASTER_HOST='192.168.10.204',MASTER_USER='jack',MASTER_PASSWORD='123456',MASTER_LOG_FILE='master-log.000009',MASTER_LOG_POS=367; #指定同步主服務器的用戶、密碼、日志文件和開始的編號
QueryOK, 0 rows affected (0.07 sec)
mysql>START SLAVE; #啟動同步進程
QueryOK, 0 rows affected (0.00 sec)
mysql>SHOW SLAVE STATUS\G; #查看狀態(tài)
***************************1. row ***************************
Slave_IO_State:Waiting for master to send event
Master_Host:192.168.10.204
Master_User:jack
Master_Port:3306
Connect_Retry:60
Master_Log_File:master-log.000009
Read_Master_Log_Pos:367
Relay_Log_File:relay-bin.000002
Relay_Log_Pos:536
Relay_Master_Log_File:master-log.000009
Slave_IO_Running:Yes
Slave_SQL_Running:Yes #看到這兩個顯示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:367
Relay_Log_Space:827
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:10
Master_SSL_Crl:
Master_SSL_Crlpath:
Using_Gtid:No
Gtid_IO_Pos:
1 row inset (0.00 sec)
從服務器驗證數(shù)據(jù)庫是否同步成功:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| hellodb |
| information_schema |
| mysql |
| performance_schema |
| s |
| slave |
| test |
+--------------------+
7 rows in set (0.00 sec)
mysql> use slave;
Database changed
mysql> show tables;
+-----------------+
| Tables_in_slave |
+-----------------+
| t1 |
+-----------------+
1 row in set (0.00 sec)
mysql> select * from t1; #已經(jīng)成功同步到主服務器的數(shù)據(jù)
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
+------+
3 rows in set (0.00 sec)
在主服務器新建一個數(shù)據(jù)庫并向之前的t1表中插入數(shù)據(jù)查看是否可以同步成功:
主服務器:
mysql> create database Slave2;
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO t1 VALUES (4),(5),(6);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
從服務器驗證:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| Slave2 |
| hellodb |
| information_schema |
| mysql |
| performance_schema |
| s |
| slave |
| test |
+--------------------+
8 rows in set (0.00 sec)
mysql> use slave;
Database changed
mysql> show tables;
+-----------------+
| Tables_in_slave |
+-----------------+
| t1 |
+-----------------+
1 row in set (0.00 sec)
mysql> select * from t1;
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
+------+
9 rows in set (0.00 sec)
至此,從服務器已經(jīng)從主服務器完成同步之前的數(shù)據(jù),并可以同步新的數(shù)據(jù)
注:操作過程當中遇到兩個問題,如下:
1、主服務器的數(shù)據(jù)庫不能備份,執(zhí)行命令式報錯:
[root@node4 binlogs]# mysqldump --all-databases --flush-logs --master-data=2 --lock-tables > /Backup.sql
mysqldump: Couldn't execute 'SET OPTION SQL_QUOTE_SHOW_CREATE=1': Unknown system variable 'OPTION' (1193)
問題分析:改錯誤是在調(diào)用 mysqldump命令是使用的默認路徑/usr/bin/mysqldump,但是由于MariaDB是安裝的目前的最新版本,此備份工具已經(jīng)比較舊了,有些特性不支持,因此可以使用MariaDB解壓包里面的備份工具即可。
2、從服務器一直不能與主服務器同步
具體表現(xiàn)為從服務器一直顯示IO進程連接正在連接:
mysql>show slave status\G;
***************************1. row ***************************
Slave_IO_State:Connecting to master
Master_Host:192.168.10.204
Master_User:jack
Master_Port:3306
Connect_Retry:60
Master_Log_File:
Read_Master_Log_Pos:4
Relay_Log_File:relay-bin.000001
Relay_Log_Pos:4
Relay_Master_Log_File:
Slave_IO_Running:Connecting
Slave_SQL_Running:Yes
查看日志先顯示賬號訪問主服務器失敗,那么就判斷為要么沒有權(quán)限要么密碼不對,在確認權(quán)限正確的情況下更改密碼,然后將從服務器的slave停止,使用新密碼重新啟動slav即可,如下;
50119 1:38:25 [ERROR] Slave I/O: error connecting to master 'jack@192.168.10.204:3306' - retry-time: 60 retries: 86400 message: Access denied for user 'jack'@'node5.a.com' (using password: YES), Internal MariaDB error code: 1045
新聞標題:MariaDB、MySQL數(shù)據(jù)庫主從同步
地址分享:http://chinadenli.net/article14/gphide.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設、做網(wǎng)站、品牌網(wǎng)站設計、面包屑導航、電子商務、ChatGPT
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)