阿里雲RDS(基礎版)及阿里雲ECS自建Mysql5.7主從
參考文章:
新主從數據庫搭建–>>http://blog.csdn.net/abcdocker/article/details/71249809
RDS高級版主從ECS搭建–>>http://blog.csdn.net/dongsong1117/article/details/51800072
- 主從基礎環境配置
- 數據遷移關係及FAQ
- 總結
基礎環境搭建
RDS爲阿里雲數據庫,不提供linux控制檯,只能通過從庫遠程mysql登入;ECS服務器部署自建mysql作爲自讀服務,很多文章都講到RDS->ECS主從,但大部分都是高級版RDS,本文涵蓋高級RDS及基礎RDS區別
1.1RDS賬戶配置
1.2ECS自建數據庫配置
假設大家已經在ECS上已經裝好mysql….如果自動安裝後不知道配置文件在哪,可以whereis mysql查詢相關位置,
root@iZwz98pmxwulw5x6ekf1r2Z:~# whereis mysql
mysql: /usr/bin/mysql /usr/lib/mysql /etc/mysql /usr/share/mysql /usr/share/man/man1/mysql.1.gz
root@iZwz98pmxwulw5x6ekf1r2Z:~# cd /etc/mysql
root@iZwz98pmxwulw5x6ekf1r2Z:/etc/mysql# ls
conf.d debian.cnf debian-start my.cnf my.cnf.fallback mysql.cnf mysql.conf.d
root@iZwz98pmxwulw5x6ekf1r2Z:/etc/mysql# cd mysql.conf.d
root@iZwz98pmxwulw5x6ekf1r2Z:/etc/mysql/mysql.conf.d# ls
mysqld.cnf mysqld_safe_syslog.cnf
root@iZwz98pmxwulw5x6ekf1r2Z:/etc/mysql/mysql.conf.d# vi mysqld.cnf
MYSQL5.7後提供倆個配置文件,分別在conf.d和mysql.conf.d;其中conf.d/mysql.cnf爲自己配置,mysql.conf.d/mysqld.conf爲服務配置,沒區別,方便區分;其實就是my.cnf引用單獨倆個配置文件
系統版本
root@iZwz98pmxwulw5x6ekf1r2Z:~# uname -a
Linux iZwz98pmxwulw5x6ekf1r2Z 4.4.0-62-generic #83-Ubuntu SMP Wed Jan 18 14:10:15 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
mysql版本
root@iZwz98pmxwulw5x6ekf1r2Z:~# mysql -V
mysql Ver 14.14 Distrib 5.7.20, for Linux (x86_64) using EditLine wrapper
MySQL配置文件
root@iZwz98pmxwulw5x6ekf1r2Z:/etc/mysql/mysql.conf.d# vi mysqld.cnf
server_id=211
read_only = 1
port = 3307
replicate-wild-ignore-table = mysql.%
replicate-wild-ignore-table = test.%
binlog_format = ROW
log-bin = mysql-bin
log-bin-index = mysql-bin.index
relay-log = relay-log
relay_log_index = relay-log.index
其中:port不能和主庫一樣,replicate-wild-ignore-table和replicate-wild-ignore-table是作爲過濾數據庫同步的,可多個,以前是設置replicate_do_db或replicate_ignore_db但存在更新問題,參見:http://blog.csdn.net/tlpower/article/details/7891870
當在主庫存在的庫而從庫不存在的庫同步時,會出現sql錯誤,這時候可以排除或者從庫手動導入主庫數據庫;
其中replicate-wild-ignore-table代表需要排除的表,寫法[數據庫名.%]
不建議使用,具體原因見 不建議使用從庫過濾DB同步關鍵字的原因
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
1.2.1GUID/binlog同步方式
參考:MySQL GTID是在傳統的mysql主從複製的基礎之上演化而來的產物,即通過UUID加上事務ID的方式來確保每一個事物的唯一性。這樣的操作方式使得我們不再需要關心所謂的log_file和log_Pos,只是簡單的告訴從庫,從哪個服務器上去找主庫就OK了。簡化了主從的搭建以及failover的過程,同時比傳統的複製更加安全可靠。由於GTID是連續沒有空洞的,因此主從庫出現數據衝突時,可以通過注入空事物的方式進行跳過。本文主要講述GTID主從架構的錯誤處理方式
具體原理:[MySQL主從複製原理、半同步操作步驟及原(https://www.abcdocker.com/abcdocker/42)
binlog方式命令過程
-- 從RDS主庫導出數據
**linux命令行下:**/usr/bin/mysqldump -uroot -p1 -h[RDS內網地址] --lock-tables --events --triggers --routines --flush-logs --master-data=2 --default-character-set=utf8mb4 --databases stockgang > /data/db.sql
--databases stockgang爲需要導出數據庫
--導入主庫數據到從庫
**linux命令行下:**mysql -uroot -p1 stockgang < /data/db.sql
--查看主庫postion位置,2種方式
1.**linux命令行下:**head /data/db.sql -n80 | grep "MASTER_LOG_POS"
2.登錄主庫mysql,後sql執行show master status;
--建立主從關係
**登錄從庫後sql命令行下:**change master to MASTER_HOST='RDS內網地址',master_user='slave',master_password='1',MASTER_LOG_FILE='mysql-bin.000325',MASTER_LOG_POS=194;
後面倆個參數爲上面那條命令查詢的日誌文件,和position位置;
--啓動從服務
從庫mysql命令行下:start slave;
可能運行此命令會出現ERROR 1776 (HY000): Parameters MASTER_LOG_FILE, MASTER_LOG_POS, RELAY_LOG_FILE and RELAY_LOG_POS cannot be set when MASTER_AUTO_POSITION is active.
解決:登錄從庫mysql後:
1.change master to master_auto_position=0;
2.開啓從庫同步,start slave;
**FAQ:**
--------
1. `ERROR 1840 (HY000) at line 24: @@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_EXECUTED is empty.`
2. 解決方式:從庫sql下輸入:reset master;重置主配置;
查看同步狀態:
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: private-gubang.mysql.rds.aliyuncs.com
Master_User: slave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000325
Read_Master_Log_Pos: 35631
Relay_Log_File: relay-log.000002
Relay_Log_Pos: 35757
Relay_Master_Log_File: mysql-bin.000325
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: mysql.%,test.%
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 35631
Relay_Log_Space: 35998
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: 404247635
Master_UUID: d339fa36-8c85-11e7-ae07-00163e04f361
Master_Info_File: /var/lib/mysql/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set: d339fa36-8c85-11e7-ae07-00163e04f361:9874-9924
Executed_Gtid_Set: d339fa36-8c85-11e7-ae07-00163e04f361:1-9924
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
1 row in set (0.00 sec)
其中Slave_IO_Running: Yes,Slave_SQL_Running: Yes需要倆個狀態都是YES,LAST_ERROR,Slave_SQL_Running_State需要正常無錯誤信息
3 總結
總得來說,搭建比較簡單,但是對原理性還了解的不夠,才導致碰到問題只會百度,還需要系統性的瞭解才行,在導入過程中一直在本機查看數據是亂碼,而服務器不管怎麼改從庫的編碼爲utf8都無用,重啓後依舊是初始值,客戶端亂碼,後臺看了N多文章N多次導入,最後問題點在於我的navicat連接編碼問題….大家不要犯錯..
附錄>>>>>>>
有時候需要手動跳過一些事件錯誤
1:停止SLAVE 服務
mysql> STOP SLAVE;
2:設置跳過的EVENT個數 (當前需要跳過錯誤數)
mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
3:啓動SLAVE服務
mysql> START SLAVE;