1.实战图解

mysql主从复制_第1张图片

2.主从同步的条件:

①server-id不同
②主库开启bin-log日志,从库开不开不影响
③主库建立同步的账号
④锁表,查看binlog文件以及位置点
⑤新开窗口导出全备份
⑥主库解锁,开放用户写入
从库:
①从库操作,把主库的全备份导入从库
②找位置点,配置master.info
③开启从库开关

3.环境说明:三个数据库服务器部署在一台服务器上的多实例

[root@oldboy scripts]# netstat -lntup|grep 330
tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      26656/mysqld       
tcp        0      0 0.0.0.0:3307                0.0.0.0:*                   LISTEN      21801/mysqld       
tcp        0      0 0.0.0.0:3308                0.0.0.0:*                   LISTEN      11749/mysqld       
[root@oldboy scripts]#

4.登录数据库并授权用户(binlog日志检查是否开启/data/3306/my.cnf)

[root@oldboy ~]# mysql  -uroot -poldboy123 -S  /data/3306/mysql.sock
mysql> grant replication slave  on *.*  to rep@'172.16.1.%'  identified  by 'oldboy123';
mysql> flush  privileges;

5.锁表查看binlog日志的位置

mysql> flush  table  with read lock;  #锁表的时候不能退出
mysql> show  master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000020 |     6162 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
mysql>

6.全量备份数据库(切记要新开一个ssh窗口,锁表不可以退出)

[root@oldboy ~]# mysqldump -uroot -poldboy123 -S /data/3306/mysql.sock   -A -B -R --events --master-data=2|gzip >/server/backup/rep_bak_$(date +%F).sql.gz
[root@oldboy ~]# ll /server/backup/rep_bak_$(date +%F).sql.gz                             
 -rw-r--r-- 1 root root 152180 6月  23 17:32 /server/backup/rep_bak_2016-06-23.sql.gz
[root@oldboy ~]#

7.主库解锁,开发用户写入

mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)
mysql>

8.从库导入主库的全备份数据

[root@oldboy ~]# cd  /server/backup/
[root@oldboy backup]# gzip -cd rep_bak_2016-06-23.sql.gz>rep_bak_2016-06-23.sql
[root@oldboy backup]# mysql -uroot -poldboy123 -S  /data/3307/mysql.sock  
  

9.找位置点,配置master.info

mysql -uroot -poldboy123 -S  /data/3307/mysql.sock
CHANGE MASTER TO
MASTER_HOST='172.16.1.52',
MASTER_PORT=3306,
MASTER_USER='rep',
MASTER_PASSWORD='oldboy123',
MASTER_LOG_FILE='mysql-bin.000020',
MASTER_LOG_POS=6162;
[root@oldboy data]# cat /data/3307/data/master.info   #检查

10.开启从库开关

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
mysql>

11.从库检查状态,是否正常

mysql> show  slave status  \G
Slave_IO_Running: Yes       #出现这两个表示正常
Slave_SQL_Running: Yes    #出现这两个表示正常读取多个文件并追加到一个文件
Seconds_Behind_Master: 0     #没有延迟


11.错误整理:

show  slave  status \G ;出现如下错误,

一般情况下 对于error错误就这么办

解决办法 
stop  slave ;
set  GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
start  salve;


12.如果是想重新change  master

如果是想重新 change  master

步骤  
       ①stop slave
       ②reset  slave  all
       ③change  master
       ④start  slave

13.快速部署主从复制

授权要在主服务器上做:

①直接锁表备份数据
mysqldump -uroot -poldboy123 -S /data/3306/mysql.sock  -x -A -B -R --events --master-data=2|gzip >/server/backup/rep_bak_$(date +%F).sql.gz
②解压全量备份数据
gzip -cd rep_bak_2016-06-25.sql.gz>rep_bak_2016-06-25.sql
③找出binlog日志的位置点
vim  rep_bak_2016-06-25.sql
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000021', MASTER_LOG_POS=396;
④恢复全备份数
mysql -uroot  -poldboy123  -S /data/3307/mysql.sock < rep_bak_2016-06-25.sql
⑤登录数据库
mysql -uroot  -poldboy123  -S /data/3307/mysql.sock
⑥第一次change  master
CHANGE MASTER TO
MASTER_HOST='172.16.1.52',
MASTER_PORT=3306,
MASTER_USER='rep',
MASTER_PASSWORD='oldboy123';
⑦第二次change  master #在全备份中取出
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000021', MASTER_LOG_POS=396;
⑧开启slave
start  slave

14数据库的线程介绍

mysql主从复制_第2张图片

mysql主从复制_第3张图片

从库:
mysql> create database testskip;
主库:
mysql> create database testskip;
从库:
mysql> show slave status  \G
               Last_SQL_Error: Error 'Can'tcreate database 'testskip'; database exists' on query. Default database:'testskip'. Query: 'create database testskip'
 Replicate_Ignore_Server_Ids:
            Master_Server_Id: 1
1 row in set (0.00 sec)
处理:
从库:
mysql> set globalsql_slave_skip_counter=1;
mysql> show slave status  \G  #故障解决