RDS主/ECS從(只讀)建立主從同步

阿里雲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)

mysqldump具體參數說明

其中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;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章