1. 程式人生 > >MySQL5.7主從複製配置,資料同步

MySQL5.7主從複製配置,資料同步

MySQL5.7主主複製配置 主機1IP:172.16.1.206 主機2IP:172.16.1.226 一、首先安裝MySQL 5.7 1、解除安裝兩臺主機系統中已經有的mysql相關軟體包 rpm -qa | grep -i mysql yum remove mysql(相關軟體包名稱) -y 2、分別在兩臺主機系統中執行以下命令 在http://dev.mysql.com/downloads/repo/yum/站點下載mysql57-community-release-el6-8.noarch rpm -ivh mysql57-community-release-el6-8.noarch.rpm  yum -y install mysql.x86_64 mysql-server.x86_64 mysql-devel.x86_64 3、分別在兩臺主機上執行以下語句,初始化 mkdir /home/mysql mysqld --initialize-insecure --user=mysql --datadir=/home/mysql 備註:     如果你用 --initialize 初始化data目錄,請用如下命令登入服務     mysql -u root -p     執行上面命令,會提示輸入密碼,輸入隨機生成的密碼即可。     如果你不知道這個隨機密碼,請檢視error log檔案查詢這個隨機密碼。     如果用 --initialize-insecure 初始化data目錄,請用root用登入,並不需要輸入密碼就可以登入,如下命令:     mysql -u root --skip-password Mysql5.7忘記root密碼及mysql5.7修改root密碼的方法的相關資料 a、關閉正在執行的 MySQL :service mysql stop b、執行:mysqld_safe --skip-grant-tables & c、為了安全可以這樣禁止遠端連線:mysqld_safe --skip-grant-tables --skip-networking &     d、使用mysql連線server:mysql -p e、更改密碼: mysql> update mysql.user set authentication_string=password('shopym') where user='root' and Host = 'localhost';      特別提醒注意的一點是,新版的mysql資料庫下的user表中已經沒有Password欄位了 而是將加密後的使用者密碼儲存於authentication_string欄位 4、分別登入修改主機1、主機2的mysql密碼 輸入mysql回車,進入mysql環境 set password = password ('shopym'); flush privileges; 5、在主機1(192.168.1.2)的/etc/my.cnf中配置以下內容 [mysqld] datadir=/home/mysql socket=/var/lib/mysql/mysql.sock log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid server-id = 1 auto-increment-increment = 2 auto-increment-offset = 1 explicit_defaults_for_timestamp = 1 character_set_server=utf8 interactive_timeout = 57600 log-bin = mysql-bin expire-logs-days = 100 replicate-do-db  = wang                 #需要同步的資料庫 binlog-ignore-db  = mysql binlog-ignore-db  = information_schema slave-skip-errors=all log-slave-updates symbolic-links=0  skip-name-resolve 6、在主機1(192.168.1.4)的/etc/my.cnf中配置以下內容 [mysqld] datadir=/home/mysql socket=/var/lib/mysql/mysql.sock log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid server-id = 2 auto-increment-increment = 2 auto-increment-offset = 2 character_set_server=utf8 interactive_timeout = 57600 log-bin = mysql-bin expire-logs-days = 100 replicate-do-db = wang                   #需要同步的資料庫 binlog-ignore-db = mysql binlog-ignore-db = information_schema slave-skip-errors=all log-slave-updates symbolic-links=0 skip-name-resolve 備註:主機1和主機2都只有server-id不同和 auto-increment- offset不同 auto-increment-offset是用來設定資料庫中自動增長的起點的,回為這兩能 伺服器都設定了一次自動增長值2,所以它們的起點必須得不同,這樣才能避 免兩臺伺服器資料同步時出現主鍵衝突replicate-do-db 指定同步的資料庫, 我們只在兩臺伺服器間同步shoym資料庫 另:auto-increment-increment的值應設為整個結構中伺服器的總數,本案例用到兩臺伺服器,所以值設為2 7、分別重啟主機1,主機2的mysql服務,使配置生效 service mysqld restart 8、在主機1(192.168.1.2)上建立資料庫和表並插入資料 mysql -uroot -pwclwcw create database wang; use wang; create table wclwcw(id int,name varchar(100)); insert into wclwcw value (1,'tom') 9、相互授權 在主機1(172.16.1.206)上 GRANT REPLICATION SLAVE ON *.* TO 'shopym'@'172.16.1.226' IDENTIFIED BY 'shopym'; flush privileges; 在主機2(172.16.1.226)上 GRANT REPLICATION SLAVE ON *.* TO 'shopym'@'172.16.1.206' IDENTIFIED BY 'shopym'     flush privileges; 10、互告bin-log資訊 a、在主機1(192.168.1.2)上 mysql> show master status; +------------------+----------+--------------+--------------------------+ | File     | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+--------------------------+ | mysql-bin.000006 |      106 |      | mysql,information_schema | +------------------+----------+--------------+--------------------------+ b、在主機2(192.168.1.4)上 mysql> show master status; +------------------+----------+--------------+--------------------------+ | File     | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+--------------------------+ | mysql-bin.000008 |      192 |      | mysql,information_schema | +------------------+----------+--------------+--------------------------+ c、在主機1(172.16.1.206)上 mysql> change master to master_host='172.16.1.226',master_user='shopym',master_password='shopym',master_log_file='mysql-bin.000008',master_log_pos=120; d、在主機2(192.168.1.226)上 mysql> change master to master_host='172.16.1.206',master_user='shopym',master_password='shopym',master_log_file='mysql-bin.000014',master_log_pos=120; RDS 是獨特的 需要這個方法 兩邊用GTID來資料同步 change master to master_host='.rds.aliyuncs.com',master_user='0000000',master_password='1q2.......#',master_auto_position=1; show global variables like 'gtid_purged'; 然後拿著這個value,去從庫上依次 stop slave; set global gtid_purged = 'xxx'; # xxx是你主庫上查到的value。 start slave; 進過測試RDS需要先查詢 set global gtid_purged ='077e9f57-b83f-11e6-844c-7cd30abff676:1-10479976,fa4f2610-b83e-11e6-844c-7cd30abff66a:1-5683819'; 要是出現: ERROR 1840 (HY000): @@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_EXECUTED is empty. 則需要執行: reset master; 11、在主機1、主機2兩伺服器都執行以下命令 mysql> start slave; 12、檢視狀態 主機1上(172.16.1.206) mysql> show slave status\G; .............. 在主機2(172.16.1.206)上 mysql> show slave status\G;  ............. 當看到了兩個yes,即: Slave_IO_Running: Yes Slave_SQL_Running: Yes 說明已經配置成功了,同時檢視主機2中是否已經有主機1中的資料庫 其他 同步資料 用test做的實驗,匯出將test.sql檔案從1.4伺服器拷貝到1.2伺服器 備份資料前先鎖表,保證資料一致性 mysql> FLUSH TABLES WITH READ LOCK; # mysqldump -uroot -p123456 test> /tmp/test.sql; mysql> UNLOCK TABLES; scp /tmp/test.sql [email protected]:/tmp 在搭建mysql master-slave複製環境時,一切都正常,但是在slave上執行:show slave status\G; 時,出現下面的狀況: Slave_IO_Running: Connecting Slave_SQL_Running: Yes 一直無法進行正確的複製。檢視錯誤日誌檔案顯示:Connecting error_code:2003 看來是slave 沒有連線上master,在網上搜索一下,網上文章大都只是指出了可能的三種錯誤: 1. 網路不通 2. 密碼不對 3. pos不對 我測試網路是可以ping通的。密碼也對,pos也對。 後來想了很久,突然想起來了防火牆好像沒有關閉!一檢查果然。 所以第四種錯誤是: 4. 防火牆沒有關閉。 相關命令如下: 關閉命令:  service iptables stop 永久關閉防火牆:chkconfig iptables off 兩個命令同時執行,執行完成後檢視防火牆關閉狀態 service iptables status 另外順便也將 selinux關閉掉: 1      vi /etc/selinux/config 2      #SELINUX=enforcing     #註釋掉 3      #SELINUXTYPE=targeted  #註釋掉 4      SELINUX=disabled  #增加 5      :wq  #儲存,關閉。 6      shutdown -r now   #重啟系統 檢視SELinux的狀態: getenforce