MySQL主從複製

描述:針對生產環境數據庫熱備,搭建以下mysql主從複製環境

搭建環境描述:
系統版本:
Linux Test2 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
下載鏈接:http://mirror.nsc.liu.se/centos-store/6.5/isos/x86_64/CentOS-6.5-x86_64-bin-DVD1.iso
MySQL數據庫版本:
mariadb-10.0.33-linux-x86_64.tar.gz
下載鏈接:http://mirrors.neusoft.edu.cn/mariadb//mariadb-10.0.33/bintar-linux-x86_64/mariadb-10.0.33-linux-x86_64.tar.gz

Mariadb安裝步驟

#新建用戶
useradd -s /sbin/nologin -M mysql
mkdir /data
#安裝包放在/data 目錄下解壓
tar -zxvf mariadb-10.0.33-linux-x86_64.tar.gz
#改一下名字
mv mariadb-10.0.33-linux-x86_64 mariadb-10.0.33
#進入到mariadb-10.0.33目錄
cd mariadb-10.0.33
#執行安裝腳本
./scripts/mysql_install_db --basedir=/data/mariadb-10.0.33/ --datadir=/data/mariadb-10.0.33/data/ --user=mysql
#拷貝配置文件
cp support-files/my-innodb-heavy-4G.cnf /etc/my.cnf
#打開配置文件
vim /etc/my.cnf
#添加以下兩行
basedir=/data/mariadb-10.0.33
datadir=/data/mariadb-10.0.33/data
#更新授權
chown -R mysql:mysql /data/mariadb-10.0.33/
#拷貝MySQLD到初始化目錄 方便使用service啓動
cp support-files/mysql.server /etc/rc.d/init.d/mysqld
#拷貝mysql mysqldump 到/usr/bin目錄下
cp bin/mysql /usr/bin
cp bin/mysqldump /usr/bin
#mysql的root用戶授權:

mysql> grant all privileges on . to 'root'@'%' identified by 'tongda666';

Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;

Query OK, 0 rows affected (0.00 sec)

需要支持MySQL主從複製需要按照實際要求在my.cnf中添加以下文件

配置(主庫)

配置(從庫)

主庫(my.cnf)
log-bin=master-bin  #主服務器二進制日誌文件前綴名  
log-bin-index=master-bin.index   #索引文件  
innodb_file_per_table= 1      #開啓innodb的一表一個文件的設置  
server-id  = IP地址           #必須是唯一的  
datadir =/mydata/data         #數據目錄路徑  
binlog_format=mixed  #從複製的格式
expire_logs_days=7  #二進制日誌自動刪除
slave_skip_errors=1062 #如:1062錯誤是指一些主鍵重複
binlog-do-db= #指定binlog日誌記錄那些庫的二進制日誌
binlog-ignore-db= #不需要複製的庫

從庫(my.cnf)
relay-log-index = relay-log.index   #中繼日誌索引
innodb_file_per_table = 1   #開啓innodb的一表一個文件的設置  
server-id       = IP地址     #id不要和主服務器的一樣  
datadir = /mydata/data  #mysql的數據目錄 
relay-log = relay-log    #設置中繼日誌  
slave_skip_errors=1062 #如:1062錯誤是指一些主鍵重複
replicate-do-table=wishrp.sku_ma #庫名。表名
replicate_do_db= #需要複製庫名
replicate_ignore_db= #不需要複製的數據庫

操作(主庫)

CREATE USER 'slave'@'從庫IP地址' IDENTIFIED BY 'slavepass'; #創建用戶
GRANT REPLICATION SLAVE ON . TO 'slave'@'從庫IP地址'; #分配權限
flush privileges; #刷新權限
SHOW MASTER STATUS; #查看master狀態
show processlist \G #查看連接
flush tables with read lock; #鎖定所有的表

unlock tables #解鎖所有表

操作(從庫)

CHANGE MASTER TO MASTER_HOST='182.92.172.80',MASTER_USER='主庫創建的用戶',MASTER_PASSWORD='密碼',MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=73; #連接主庫
stop slave; #停止同步
start slave; #開始同步
reset slave; #刪除master.info和relay-log.info文件;
stop slave; #停止同步
change master to master_heartbeat_period = 10; #設置發送心跳包間隔
set global slave_net_timeout = 25;  #設置無數據網絡超時檢測間隔
start slave;  #開啓複製
show status like 'slave%'; #顯示從庫心跳狀態
show slave status\G #查看從庫連接狀態
show slave status\G 查看Seconds_Behind_Master項參數 數值越大延時越多 #查看主從複製延時

percona-toolkit介紹

1)pt-table-checksum 負責監測mysql主從數據一致性
2)pt-table-sync 負責當主從數據不一致時修復數據,讓它們保存數據的一致性
3)pt-heartbeat 負責監控mysql主從同步延遲

依賴包
yum install perl-IO-Socket-SSL perl-DBD-MySQL perl-Time-HiRes perl perl-DBI -y
下載鏈接:https://www.percona.com/downloads/percona-toolkit/2.2.7/RPM/percona-toolkit-2.2.7-1.noarch.rpm

第一次使用

使用之前注意
在主庫執行授權(一定要對主庫ip授權,授權的用戶名和密碼可以自行定義,不過要保證這個權限能同時登陸主庫和從庫)
mysql> GRANT SELECT, PROCESS, SUPER, REPLICATION SLAVE,CREATE,DELETE,INSERT,UPDATE ON . TO 'root'@'主庫IP地址' identified by '123456';
mysql> flush privileges;
在從庫上執行授權
mysql> GRANT SELECT, PROCESS, SUPER, REPLICATION SLAVE ON . TO 'root'@'主庫IP地址' IDENTIFIED BY '123456';
mysql> flush privileges;
沒有唯一索引或者主鍵時也會報錯

檢測同步-使用示例
pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicate=huanqiu.checksums --create-replicate-table --databases=huanqiu --tables=haha h=192.168.1.101,u=root,p=123456,P=3306

常用參數解釋:
(別忘了第一次運行的時候需要添加--create-replicate-table參數創建表名爲checksum的表 ,後續再運行時就不需要加了)
--nocheck-replication-filters :不檢查複製過濾器,建議啓用。後面可以用--databases來指定需要檢查的數據庫。
--no-check-binlog-format : 不檢查複製的binlog模式,要是binlog模式是ROW,則會報錯。
--replicate-check-only :只顯示不同步的信息。
--replicate= :把checksum的信息寫入到指定表中,建議直接寫到被檢查的數據庫當中。
--databases= :指定需要被檢查的數據庫,多個則用逗號隔開。
--tables= :指定需要被檢查的表,多個用逗號隔開
h= :Master的地址
u= :用戶名
p=:密碼
P= :端口

執行結果
解釋:
TS :完成檢查的時間。
ERRORS :檢查時候發生錯誤和警告的數量。
DIFFS :0表示一致,1表示不一致。當指定--no-replicate-check時,會一直爲0,當指定--replicate-check-only會顯示不同的信息。
ROWS :表的行數。
CHUNKS :被劃分到表中的塊的數目。
SKIPPED :由於錯誤或警告或過大,則跳過塊的數目。
TIME :執行的時間。
TABLE :被檢查的表名。

修復同步-使用示例
pt-table-sync --replicate=huanqiu.checksums h=192.168.1.101,u=root,p=123456 h=192.168.1.102,u=root,p=123456 --print

參數解釋:
--replicate= :指定通過pt-table-checksum得到的表,這2個工具差不多都會一直用。
--databases= : 指定執行同步的數據庫。
--tables= :指定執行同步的表,多個用逗號隔開。
--sync-to-master :指定一個DSN,即從的IP,他會通過show processlist或show slave status 去自動的找主。
h= :服務器地址,命令裏有2個ip,第一次出現的是Master的地址,第2次是Slave的地址。
u= :帳號。
p= :密碼。
--print :打印,但不執行命令。
--execute :執行命令。

#自動檢測數據是否一致腳本
#!/bin/bash
NUM=$(/usr/bin/pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicate=huanqiu.checksums --databases=huanqiu  h=192.168.1.101,u=root,p=123456,P=3306|awk -F" " '{print $3}'|sed -n '2p')
if [ $NUM -eq 1 ];then
  /usr/bin/pt-table-sync --replicate=huanqiu.checksums h=192.168.1.101,u=root,p=123456 h=192.168.1.102,u=root,p=123456 --print
  /usr/bin/pt-table-sync --replicate=huanqiu.checksums h=192.168.1.101,u=root,p=123456 h=192.168.1.102,u=root,p=123456 --execute
else
  echo "data is ok"
fi

整體操作流程

開始

配置從庫my.cnf

     配置主庫my.cnf

創建主從複製用戶

從庫連接主庫配置
CHANGE MASTER TO MASTER_HOST='182.92.172.80',
MASTER_USER='主庫創建的用戶',
MASTER_PASSWORD='密碼',
MASTER_LOG_FILE='mysql-bin.000003',
MASTER_LOG_POS=73;

創建percona-toolkit
用戶

開啓複製
start slave;

鎖定主庫所有表寫操作

flush tables with read lock;

查看連接狀態
show slave status\G

查看主庫binlog狀態
SHOW MASTER STATUS;

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

     解鎖表

unlock tables
MySQL主從複製

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