方案一:主從數據必須一致
=======================================================================Mysql主庫有數據,從庫從新初始化數據流程============================================================================
0、停止應用,mysql主庫全庫備份
1、停止從庫複製進程
stop slave ;
2、鎖定主數據庫,只允許讀取不允許寫入,這樣做的目的是防止備份過程中或備份完成之後有新數據插入,導致備份數據和主數據數據不一致。主庫鎖表(將所有的髒頁都要刷新到磁盤,然後對所有的表加上了讀鎖)
flush tables with read lock;
3、查詢主數據庫狀態,並記下FILE及Position的值
show master status;
4、備份主庫數據
mysqldump aqzx -usystem -p'XXX' > aqzx.sql
mysqldump yhzx -usystem -p'XXX' > yhzx.sql
mysqldump confcenter -usystem -p'XXX' > confcenter.sql
mysqldump lhywzx -usystem -p'XXX' > lhywzx.sql
mysqldump aqzx -usystem -p'XXX' > aqzx.sql
5、將主庫數據導入從庫數據庫 保持主從數據一致
drop database aqzx;
create database aqzx;
mysql aqzx -usystem -p'XXX' < aqzx.sql
6、從庫配置
change master to master_host='172.17.0.2',
master_user='slave',
master_password='XXX',
master_port=3306,
master_log_file='mysql-bin.XXXX',
master_log_pos= 4952,
master_connect_retry=30;
7、啓動主從複製start slave;,此時查看從庫狀態show slave status \G;,若是SlaveIORunning 和 SlaveSQLRunning 都是Yes,說明開啓主從複製過程成功。
8、解鎖主數據庫 切換回主數據庫的終端,進行表解鎖操作。
unlock tables;
9、測試主從複製
總結:是對主庫的數據進行備份,然後將主數據庫中導出的數據導入到從數據庫,然後再開啓主從複製,以此來保證主從數據庫數據一致。
方案二:必須一致,最簡單方法
還有一種方法:
slave-skip-errors = 1062
重啓mysql服務
方案三:主鍵衝突後的沒有進入從庫的數據可以不要
從庫
stop slave;
reset slave;
主庫
reset master;
show master status;
+------------------+----------+---------------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+---------------------+------------------+-------------------+
| mysql-bin.000023 | 506 | Hoboson,Hoboson0316 | mysql | |
+------------------+----------+---------------------+------------------+-------------------+
從庫
change master to master_host='192.168.2.81',
master_user='slave',
master_password='123456',
master_port=3306,
master_log_file='mysql-bin.000001',
master_log_pos= 154,
master_connect_retry=30;
start slave;
show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.2.81
Master_User: slave
Master_Port: 3306
Connect_Retry: 30
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 154
Relay_Log_File: k8s82-master-relay-bin.000002
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
主庫數據:select * from tb_dept;
+----+-----------------+-----------------+
| Id | Name | description |
+----+-----------------+-----------------+
| 1 | 研發部 | 研發部 |
| 2 | 人事部 | 人事部 |
| 3 | 考勤簿 | 考勤簿 |
| 4 | 遊戲俱樂部 | 遊戲俱樂部 |
| 5 | KTV | KTV |
| 6 | 軍事基地 | 軍事基地 |
| 7 | 軍事基地 | 軍事基地 |
| 8 | 軍事基地 | 軍事基地 |
| 9 | 飯堂 | 飯堂 |
| 10 | 圖書館 | 圖書館 |
| 11 | 圖書館1 | 圖書館1 |
| 12 | 圖書館2 | 圖書館2 |
| 13 | 圖書館3 | 圖書館3 |
| 14 | 圖書館4 | 圖書館4 |
| 15 | 圖書館5 | 圖書館5 |
| 16 | 圖書館6 | 圖書館6 |
+----+-----------------+-----------------+
從庫數據:select * from tb_dept;
+----+-----------------+-----------------+
| Id | Name | description |
+----+-----------------+-----------------+
| 1 | 研發部 | 研發部 |
| 2 | 人事部 | 人事部 |
| 3 | 考勤簿 | 考勤簿 |
| 4 | 遊戲俱樂部 | 遊戲俱樂部 |
| 5 | KTV | KTV |
| 6 | 軍事基地 | 軍事基地 |
| 7 | 軍事基地 | 軍事基地 |
| 8 | 軍事基地 | 軍事基地 |
| 9 | 飯堂 | 飯堂 |
| 10 | 圖書館 | 圖書館 |
| 16 | 圖書館6 | 圖書館6 |
+----+-----------------+-----------------+
圖書館1-5丟失 但是後面的數據可以正常使用,對數據一致性要求不高可以使用
方法四:
將主從不一致的的數據庫或者表使用mysqldump 導出 mysql導入
有可能有主鍵衝突,然後結合方案二處理
測試腳本:
create table tb_dept(
Id int primary key auto_increment,#部門編號 整形 主鍵 自增長
Name varchar(18),#部門名稱
description varchar(100)#描述
);
INSERT INTO `tb_dept`(`Id`, `Name`, `description`) VALUES (111, '研發部', '研發部');
INSERT INTO `tb_dept`(`Id`, `Name`, `description`) VALUES (112, '人事部', '人事部');
INSERT INTO `tb_dept`(`Id`, `Name`, `description`) VALUES (113, '考勤簿', '考勤簿');
INSERT INTO `tb_dept`(`Id`, `Name`, `description`) VALUES (114, '遊戲俱樂部', '遊戲俱樂部');
INSERT INTO `tb_dept`(`Id`, `Name`, `description`) VALUES (115, 'KTV', 'KTV');
INSERT INTO `tb_dept`(`Id`, `Name`, `description`) VALUES (116, '軍事基地', '軍事基地');
INSERT INTO `tb_dept`(`Id`, `Name`, `description`) VALUES (117, '軍事基地', '軍事基地');
INSERT INTO `tb_dept`(`Id`, `Name`, `description`) VALUES (118, '軍事基地', '軍事基地');
INSERT INTO `tb_dept`(`Id`, `Name`, `description`) VALUES (119, '飯堂', '飯堂');
跨服務器數據導入:
mysqldump --host=h1 -uroot -proot --databases db1 |mysql --host=h2 -uroot -proot db2
將h1服務器中的db1數據庫的所有數據導入到h2中的db2數據庫中,db2的數據庫必須存在否則會報錯
mysqldump --host=192.168.80.137 -uroot -proot -C --databases test |mysql --host=192.168.80.133 -uroot -proot test