-
- 版本一致
- 初始化表,并在后臺啟動mysql
- 修改root的密碼
-
修改主服務(wù)器master:
#vi /etc/my.cnf [mysqld] log-bin=mysql-bin //[必須]啟用二進(jìn)制日志 server-id=220 //[必須]服務(wù)器唯一ID创译,默認(rèn)是1店溢,一般取IP(192.168.10.220)最后一段
-
修改從服務(wù)器slave:
#vi /etc/my.cnf [mysqld] log-bin=mysql-bin //[必須]啟用二進(jìn)制日志 server-id=221 //[必須]服務(wù)器唯一ID,默認(rèn)是1矩桂,一般取IP(192.168.10.221)最后一段
-
在主服務(wù)器上建立帳戶并授權(quán)slave:
#/usr/local/mysql/bin/mysql -uroot -p mysql>CREATE USER 'mysync'@'192.168.10.221' IDENTIFIED BY 'q123456'; mysql>GRANT REPLICATION SLAVE ON *.* to 'mysync'@'192.168.10.221' identified by 'q123456'; //一般不用 root帳號沸移,%表示所有客戶端都可能連,只要帳號侄榴,密碼正確雹锣,此處可 用具體客戶端IP代替,如192.168.145.221癞蚕,加強安全蕊爵。
-
登錄主服務(wù)器的mysql,查詢master的狀態(tài)
mysql> show master status; +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000008 | 708 | | | | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)
-
配置從服務(wù)器
mysql>change master to master_host='192.168.145.220', master_user='mysync',master_password='q123456', master_log_file='mysql-bin.000008',master_log_pos=708; //注意不要斷開桦山,708數(shù)字前后無單引號攒射。 mysql>start slave; //啟動從服務(wù)器復(fù)制功能
-
查看從服務(wù)器狀態(tài)
mysql> show slave status; #注意Slave_IO_Running: Yes //此狀態(tài)必須YES #注意Slave_SQL_Running: Yes //此狀態(tài)必須YES #檢查狀態(tài)時發(fā)現(xiàn)Fatal error: The slave I/O thread stops because #master and slave have equal MySQL server UUIDs; these UUIDs #must be different for replication to work. # 因為測試時使用的虛擬機,整個復(fù)制了另一個虛擬機恒水,所以会放,倆份 #mysql是一模一樣的,mysql 5.6的復(fù)制引入了uuid的概念钉凌,各個復(fù)制結(jié) #構(gòu)中的server_uuid得保證不一樣咧最,但是查看到直接copy data文件夾 #后server_uuid是相同的,show variables like '%server_uuid%';解決方 #法:找到data文件夾下的auto.cnf文件御雕,修改里面的uuid值矢沿,保證各個 #db的uuid不一樣,重啟db即可,另外server_id也檢查一下酸纲,是否相同
主從配置完成
主從庫會同步數(shù)據(jù)行捣鲸,但并不會同步庫和表的結(jié)構(gòu)信息
在主從上都創(chuàng)建數(shù)據(jù)庫
CREATE DATABASE IF NOT EXISTS test DEFAULT CHARSET utf8 COLLATE utf8_general_ci
-
在主從上都上創(chuàng)建表
CREATE TABLE `test` ( `id` int NOT NULL AUTO_INCREMENT , `name` varchar(255) NULL , `age` int NULL , PRIMARY KEY (`id`) );
-
在master上插入數(shù)據(jù)[會同步到從庫]
INSERT INTO `test`.`test` (`id`, `name`, `age`) VALUES ('1', 'mico', '18'); INSERT INTO `test`.`test` (`id`, `name`, `age`) VALUES ('2', 'cube', '20');
-
在master上刪除數(shù)據(jù)(模擬誤操作[會同步到從庫])
delete from test;
mysql> select * from test; Empty set (0.00 sec)
binglog2sql簡介
利用binlog2sql閃回工具,來恢復(fù)誤刪除的數(shù)據(jù)闽坡。我們都知道binlog的作用是備份恢復(fù)和完成MySQL的主從復(fù)制功能栽惶。利用mysqlbinlog工具可以進(jìn)行基于時間點或者位置偏移量的數(shù)據(jù)恢復(fù)工作脓诡,在生產(chǎn)環(huán)境中遇到誤刪除,改錯數(shù)據(jù)的情況媒役,那是常有的事兒祝谚。我們都知道Oracle數(shù)據(jù)庫有閃回功能,而MySQL本身沒有自帶閃回酣衷,但我們可以使用binlog2sql來完成這項工作交惯。binlog是以event作為單位,來記錄數(shù)據(jù)庫變更的數(shù)據(jù)信息穿仪,閃回就是可以幫助我們重現(xiàn)這些變化數(shù)據(jù)信息之前的操作席爽。也就是說對于insert操作,會生成delete語句啊片,反之delete操作只锻,會生成insert語句。對于update操作紫谷,也會生成相反的update語句齐饮。這款工具只能使用在binlog格式為row模式下。-
安裝依賴
python-pip 笤昨, PyMySQL 祖驱, python-mysql-replication, wheel argparse
-
如果是內(nèi)網(wǎng)環(huán)境瞒窒,需要手動下載三方包安裝捺僻,此次測試使用pip安裝三方包
wget https://bootstrap.pypa.io/get-pip.py python get-pip.py pip -V #查看pip版本 unzip binlog2sql-master.zip cd binlog2sql-master pip install –r requirements.txt
-
python binlog2sql.py --help
-B, --flashback 生成回滾語句 --start-file 需要解析的binlog文件 --start-position 解析binlog的起始位置 --stop-position解析binlog的結(jié)束位置 --start-datetime 從哪個時間點的binlog開始解析,格式必須為datetime --stop-datetime 到哪個時間點的binlog停止解析崇裁,格式必須為datetime -d, --databases 只輸出目標(biāo)db的sql -t, --tables 只輸出目標(biāo)tables的sql
-
確定當(dāng)前binlog文件和position位置
mysql> show master status; +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000008 | 1932 | | | | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)
可以看到當(dāng)前binlog是:mysql-binlog.000008
位置偏移量:1932
- 需要預(yù)估下時間匕坯,誤操作的時間范圍應(yīng)該在下午14點20分到14點30分之間:
[root@localhost binlog2sql]# python binlog2sql.py -h192.168.10.220 - P3306 -uroot -pmico -dtest -ttest --start-file='mysql-bin.000008' --start- datetime='2017-12-09 14:20:00' --stop-datetime='2017-12-09 14:30:00' # 結(jié)果發(fā)現(xiàn)啥都沒有。拔稳。葛峻。執(zhí)行date命令發(fā)現(xiàn)時區(qū)不對。壳炎∨⑶福”普欤現(xiàn)在是凌 # 晨2點: [root@localhost binlog2sql]# python binlog2sql.py -h192.168.10.220 - P3306 -uroot -pmico -dtest -ttest --start-file='mysql-bin.000008' INSERT INTO `test`.`test`(`age`, `id`, `name`) VALUES (18, 1, 'mico'); #start 1524 end 1697 time 2017-12-09 01:46:27【插入語句】 INSERT INTO `test`.`test`(`age`, `id`, `name`) VALUES (20, 2, 'cube'); #start 1728 end 1901 time 2017-12-09 01:46:27【插入語句】 DELETE FROM `test`.`test` WHERE `age`=20 AND `id`=2 AND `name`='cube' LIMIT 1; #start 1932 end 2105 time 2017-12-09 02:00:21【第一個刪除語句】 DELETE FROM `test`.`test` WHERE `age`=18 AND `id`=1 AND `name`='mico' LIMIT 1; #start 2136 end 2309 time 2017-12-09 02:00:21【第二個刪除語句】 # 縮小范圍: [root@localhost binlog2sql]# python binlog2sql.py -h192.168.10.220 -P3306 -uroot -pmico -dtest -ttest --start-file='mysql-bin.000008' --start-datetime='2017-12-09 02:00:00' --stop-datetime='2017-12-09 02:01:00' DELETE FROM `test`.`test` WHERE `age`=20 AND `id`=2 AND `name`='cube' LIMIT 1; #start 1932 end 2105 time 2017-12-09 02:00:21【刪除語句】 DELETE FROM `test`.`test` WHERE `age`=18 AND `id`=1 AND `name`='mico' LIMIT 1; #start 2136 end 2309 time 2017-12-09 02:00:21【刪除語句】
- 由上一步可知匿辩,誤操作的sql位置在1932到2309之間:
[root@localhost binlog2sql]# python binlog2sql.py -h192.168.10.220 -P3306 -uroot -pmico -dtest -ttest --start-file='mysql-bin.000008' --start-position=1932 --stop-position=2309 -B >t_rollback.sql [root@localhost binlog2sql]# cat t_rollback.sql INSERT INTO `test`.`test`(`age`, `id`, `name`) VALUES (18, 1, 'mico'); #start 2136 end 2309 time 2017-12-09 02:00:21 INSERT INTO `test`.`test`(`age`, `id`, `name`) VALUES (20, 2, 'cube'); #start 1932 end 2105 time 2017-12-09 02:00:21
- 使用回滾文件,恢復(fù)數(shù)據(jù)
mysql -uroot -pmico test < t_rollback.sql
- 檢驗數(shù)據(jù)是否恢復(fù)成功
mysql> select * from test; +----+------+------+ | id | name | age | +----+------+------+ | 1 | mico | 18 | | 2 | cube | 20 | +----+------+------+ 2 rows in set (0.00 sec)