14、mysql主从复制实战


14. 1、服务器准备:

一台服务器,多实例,客户端编码是utf8,服务端编码是utf8;

[root@backup 3308]#netstat -tunlp | grep 330

tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 4664/mysqld

tcp 0 0 0.0.0.0:3307 0.0.0.0:* LISTEN 5511/mysqld

tcp 0 0 0.0.0.0:3308 0.0.0.0:* LISTEN 10571/mysqld

1、主库(mysql master):[ip为172.16.1.41 port为3306]

2、从库1(mysql slave):[ip为172.16.1.41 port为3307]

3、从库2(mysql slave):[ip为172.16.1.41 port为3308]

4、mysql的登录用户和密码分别是root,123456

14.2、说明:

1、一般常规做主从复制,主从服务器多数在不同的机器上,并且监听的端口号均为默认的3306;

2、本文主要是针对以单数据库多实例的环境来讲解的;

3、第1点虽然不在一个机器上,但是步骤和过程和第2点是一样的;

14.3、配置说明:

1、打开主库的binlog,一般从库不开启binlog功能,除非从库做备份或为下面的从库做主库(级联);

2、确保每个实例的id不同;

3、在主库上配置用于从库复制的账号:

[root@backup ~]#mysql -uroot -p123456 -S /data/3306/mysql.sock

mysql> grant replication slave on *.* to 'lc'@'172.16.1.%' identified by '123456';

mysql> flush privileges;

4、锁主库拿到binlog文件名和binlog的pos点:

mysql> flush table with read lock; #5.5的数据库;

#5.1的是flush table with read lock;

#注意:关闭mysql登录窗口或锁表参数超时,锁表失效;

#锁表的时候要申请停机时间;

mysql> show master status;

mysql> show master status;

+------------------+----------+--------------+------------------+

| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+------------------+----------+--------------+------------------+

| mysql-bin.000001 | 331 | | |

+------------------+----------+--------------+------------------+

1 row in set (0.00 sec)

5、备份主库的数据库(切换一个连接窗口):

[root@backup ~]#mysqldump -uroot -p123456 -A -B -R --events -S /data/3306/mysql.sock >/tmp/mysql_bak.sql

提示:如果在备份的时候加了-F会刷新binglog日志,只是变了文件而已,中间没有数据,可以使用新的pos点;

6、再次查看主库的binlog文件和对应的pos点:

pos点没有发生改变,说明备份的时候主库锁定成功;

mysql> show master status;

+------------------+----------+--------------+------------------+

| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+------------------+----------+--------------+------------------+

| mysql-bin.000001 | 331 | | |

+------------------+----------+--------------+------------------+

1 row in set (0.00 sec)

7、解主库操作:

mysql> unlock tables;

8、将备份的主库还原到从库上:

[root@backup ~]#mysql -uroot -p123456 -S /data/3307/mysql.sock </tmp/mysql_bak.sql

9、在从库上配置参数:

(1)配置参数:

[root@backup ~]#mysql -uroot -p123456 -S /data/3307/mysql.sock
CHANGE MASTER TO

MASTER_HOST='172.16.1.41',

MASTER_PORT=3306,

MASTER_USER='lc',

MASTER_PASSWORD='123456',

MASTER_LOG_FILE='mysql-bin.000001',

MASTER_LOG_POS=331;

(2)查看参数:

[root@backup ~]#cat /data/3307/data/master.info

18

mysql-bin.000001

331

172.16.1.41

lc

123456

3306

60 #重试连接间隔为60s

0

0

1800.000

0

(3)开启从库:

mysql> start slave; #停止使用stop slave;

(4)查看从库启动是否成功:

mysql> show slave status\G;

*************************** 1. row ***************************

Slave_IO_State: Waiting for master to send event

Master_Host: 172.16.1.41

Master_User: lc

Master_Port: 3306

Connect_Retry: 60

Master_Log_File: mysql-bin.000001

Read_Master_Log_Pos: 331

Relay_Log_File: mysqld-relay-bin.000002

Relay_Log_Pos: 253

Relay_Master_Log_File: mysql-bin.000001

Slave_IO_Running: Yes #slave的IO线程,负责和主库进行通讯取主库的binlog;

Slave_SQL_Running: Yes #slave的SQL线程,负责读取主库的binlog;

Replicate_Do_DB:

Replicate_Ignore_DB:

Replicate_Do_Table:

Replicate_Ignore_Table:

Replicate_Wild_Do_Table:

Replicate_Wild_Ignore_Table:

Last_Errno: 0

Last_Error:

Skip_Counter: 0

Exec_Master_Log_Pos: 331

Relay_Log_Space: 410

Until_Condition: None

Until_Log_File:

Until_Log_Pos: 0

Master_SSL_Allowed: No

Master_SSL_CA_File:

Master_SSL_CA_Path:

Master_SSL_Cert:

Master_SSL_Cipher:

Master_SSL_Key:

Seconds_Behind_Master: 0 #从库落后主库的秒数为0,表示正确;

Master_SSL_Verify_Server_Cert: No

Last_IO_Errno: 0

Last_IO_Error:

Last_SQL_Errno: 0

Last_SQL_Error:

Replicate_Ignore_Server_Ids:

Master_Server_Id: 1

1 row in set (0.00 sec)

(5)[root@backup 3307]#ls data/

master.info #IO线程使用,记录主库binlog文件名和binlog的pos点,然后从主库拉binlog日志;

mysqld-relay-bin.000001 #IO线程从主库拉来的binlog日志;

mysqld-relay-bin.000002

mysqld-relay-bin.index #记录mysqld-relay-bin的列表;

relay-log.info #SQL线程使用,读取mysqld-relay-bin日志的文件名和pos点;

1)[root@backup data]#cat master.info

18

mysql-bin.000002

107

#上面两个参数表示从库的io线程读取主库的binlog的pos点;

172.16.1.41

lc

123456

3306

60

0

0

1800.000

0

2)[root@backup data]#cat mysqld-relay-bin.index

./mysqld-relay-bin.000001

./mysqld-relay-bin.000002

3)[root@backup data]#cat relay-log.info

./mysqld-relay-bin.000002

253

#上面的两个参数表示从库sql线程读取relay-log文件的pos点;

mysql-bin.000002

107

#上面的两个参数表示从库的io线程读取主库的binlog的pos点;

14.4、登录数据库查看mysql线程同步状态:

1、主库线程状态:

mysql> show processlist\G;

*************************** 2. row ***************************

Id: 11

User: lc

Host: 172.16.1.41:56330

db: NULL

Command: Binlog Dump

Time: 726

State: Master has sent all binlog to slave; waiting for binlog to be updated #IO线程;

Info: NULL

2 rows in set (0.00 sec)

(1)IO线程:

2、从库线程状态:

mysql> show processlist\G;

*************************** 1. row ***************************

Id: 1

User: system user

Host:

db: NULL

Command: Connect

Time: 789

State: Slave has read all relay log; waiting for the slave I/O thread to update it #sql线程;

Info: NULL

*************************** 2. row ***************************

Id: 2

User: system user

Host:

db: NULL

Command: Connect

Time: 789

State: Waiting for master to send event #IO线程;

Info: NULL

(1)IO线程:

(2)sql线程:

14.5、总结:

1、master-data=1或2使用的场合主要用于mysql的主从复制,使用'1'代表的是标记的位置点;

不会被注释掉,在slave上导入数据时就会执,使用'2'时代表标记的位置点会被注释掉,导入从库时不会被执行;

此参数在mysql的InnoDB引擎上使用

2、mysql主从同常规步骤(需要停库):

3、备份时使用的是--master-data=1参数快速配置mysql主从复制的方案(不需要停库):

(1)安装配置好主从数据库,主从数据库的server-id不同,打开主库的log-bin日志功能,从库

一般不打开log-bin的功能,除非从库做备份或为下面的从库做主库使用;

(2)在主库上为从库设置从库连接的账号grant replication slave on *.* to 'lc'@'172.16.1.%' identified by '123456'; ;

(3)使用mysqldump -uroot -p123456 -A -B --single-transaction -R -F --master-data=1 -S /data/3306/mysql.sock | gzip >/tmp/mysql_bak.sql;

#事先备份的数据库或者时现场备也可以;

(4)在从库上还原备份的主库:

gzip -d /tmp/mysql_bak.sql

mysql -uroot -p123456 -S /data/3307/mysql.sock </tmp/mysql_bak.sql

(5)在从库上执行CHANG MASTER语句:

不需要MASTER_LOG_FILE文件和MASTER_LOG_POS配置位置点;

CHANGE MASTER TO

MASTER_HOST='172.16.1.41',

MASTER_PORT=3306,

MASTER_USER='lc',

MASTER_PASSWORD='123456',

(6)在从库上开启同步开关:

mysql> start slave;

(7)在从库上检查同步的状态:

mysql> show slave status\G;

说明:该方法只要有主库的备份和主库的binlog随时可以制作mysql主从同步;

4、锁库的时间说明:

这个锁表命令的时间,在不同的引擎的情况下,会受到下面参数的控制,锁表时,如果

超过设置时间不操作会自动解锁;

interactive_timeout

wait_timeout

(1)默认的锁库时间为8小时:

mysql> show variables like '%timeout%';

+----------------------------+----------+

| Variable_name | Value |

+----------------------------+----------+

| connect_timeout | 10 |

| delayed_insert_timeout | 300 |

| innodb_lock_wait_timeout | 120 |

| innodb_rollback_on_timeout | OFF |

| interactive_timeout | 28800 |

| lock_wait_timeout | 31536000 |

| net_read_timeout | 30 |

| net_write_timeout | 60 |

| slave_net_timeout | 3600 |

| wait_timeout | 28800 |

+----------------------------+----------+

10 rows in set (0.00 sec)

(2)设置锁库的时间:

退出当前mysql登录窗口后重新登录mysql生效;

重启mysql后失效,因为没有配置mysql的my.cnf配置文件;

mysql> set global interactive_timeout=28800;

mysql> set global wait_timeout=28800;

5、使用脚本的方法实现批量创建mysql主从同步:

关键脚本如下,其它脚本根据步骤写即即可;

cat | mysql -uroot -p123456 -S /data/3307/mysql.sock <<EOF

CHANGE MASTER TO

MASTER_HOST='172.16.1.41',

MASTER_PORT=3306,

MASTER_USER='lc',

MASTER_PASSWORD='123456',

MASTER_LOG_FILE='mysql-bin.000001',

MASTER_LOG_POS=331;


EOF

说明:注意该cat的写法,cat加管道符指的是执行管道符后面的到EOF结尾的内容,最后一行

要留空行,不然执行完后跳不出来;也可用yes代替cat,yes命令在命令行中输出指定的字符

串,直到yes进程被杀死,不带任何参数输入yes命令默认的字符串就是y;

6、说明:主从同步通过CHANG命令后就确定了从,以后启动mysql实例后会自动开启start slave,即有master.info的就是从库,不然从库开不起,关闭从库的方法 stop slave reset master 删除master info

重启mysql;


猜你喜欢

转载自www.cnblogs.com/LiuChang-blog/p/12315827.html