一、MySQL复制概述
MySQL支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。MySQL复制基于主服务器在二进制日志中跟踪所有对数据库的更改(更新、删除等等)。因此,要进行复制,必须在主服务器上启用二进制日志。每个从服务器从主服务器接收主服务器上已经记录到其二进制日志的保存的更新。当一个从服务器连接主服务器时,它通知主服务器定位到从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,并在本机上执行相同的更新。然后封锁并等待主服务器通知新的更新。从服务器执行备份不会干扰主服务器,在备份过程中主服务器可以继续处理更新。
二、复制实现细节
master开启bin-log功能,日志文件用于记录数据库的读写增删
需要开启3个线程,master IO线程,slave开启 IO线程 SQL线程,
Slave 通过IO线程连接master,并且请求某个bin-log,position之后的内容。
MASTER服务器收到slave IO线程发来的日志请求信息,io线程去将bin-log内容,position返回给slave IO线程。
slave服务器收到bin-log日志内容,将bin-log日志内容写入relay-log中继日志,创建一个master.info的文件,该文件记录了master ip 用户名 密码 master bin-log名称,bin-log position。
slave端开启SQL线程,实时监控relay-log日志内容是否有更新,解析文件中的SQL语句,在slave数据库中去执行。
三、主从复制的配置方法
1. 在master创建复制用户(使用root,就不用了,但是确保远程可以连接)
mysql> grant replication slave on *.* to zs@'192.168.43.%' identified by '123456';
授权用户 zs 密码为123456 允许192.168.43.0的网络连接 一会儿要在slave上使用这个账号
2. 修改master的配置文件,开启binlog日志和设置需要复制的数据库
[mysqld]
server-id = 1
log-bin=D:\DB\log\mysql-bin.log
#binlog_do_db=metadata
#binlog_do_db=task_center
#binlog_ignore_db=mysql
#binlog_format=mixed
expire-logs-days = 14
max-binlog-size = 50000M
show master status; #此命令查看主服务器的bin-log日志文件名称和position点
3. 修改slave 配置,设置数据库id 和 relaylog的路径
[mysqld]
server-id = 2
或:
[mysqld]
server-id = 2#replicate-do-db=db1
#replicate-ignore-db =mysql,information_schema
#relay 可以不配置
relay-log=/opt/mysql/data/mysqlb-relay-bin
relay-log-index=/opt/mysql/data/mysqlb-relay-bin.index
备注(配置文件中注释部分): binlog-do-db:指定mysql的binlog日志记录哪个db
Replicate_Do_DB:参数是在slave上配置,指定slave要复制哪个库
设置replicate_do_db或replicate_ignore_db后,MySQL执行sql前检查的是当前默认数据库,所以跨库更新语句被忽略。
可以使用replicate_wild_do_table和replicate_wild_ignore_table来代替
如
replicate_wild_do_table=test.%
或
replicate_wild_ignore_table=mysql.%
这样就可以避免出现上述问题了
relay_log:定义relay_log的位置和名称,
如果值为空,则默认位置在数据文件的目录,文件名为host_name-relay-bin.nnnnnn(By default, relay log file names have the form host_name-relay-bin.nnnnnn in the data directory);
relay_log_index:同relay_log,定义relay_log的位置和名称;
4. 重启master和slave数据库服务器
master: 查看配置 show variables like '%log_bin%';
slave 查看相关的配置:show variables like '%server_id%';
5. 在master上执行(看需要-如果正在运行的数据库)
mysql>flush tables with read lock;
mysql>show master status;
*************************** 1. row ***************************
File: binlog.000006
Position: 107
Binlog_Do_DB: test
Binlog_Ignore_DB: mysql
1 row in set (0.00 sec)
mysql>unlock tables;
注:这里锁表的目的是为了生产环境中不让进新的数据,好让从服务器定位同步位置。初次同步完成后,记得解锁。
6. 在slave上,使用change master指向同步位置
mysql> change master to
master_host='172.10.0.208',master_port=3307,
master_user='root', master_password='123456',
master_log_file='mysql-bin.000002', master_log_pos=342;
注:master_log_file,master_log_pos由上面主服务器查出的状态值中确定。master_log_file对应File,master_log_pos对应Position。mysql 5.x以上版本已经不支持在配置文件中指定主服务器相关选项。
7. 启动从服务器复制线程
mysql>start slave;
8. 查看复制状态 MariaDB [(none)]> show slave status\G
MariaDB [(none)]> start slave; #好启动slave
这样就启动成功了。
9.错误解决:
Got fatal error 1236 from master when reading data from binary log: 'log event entry exceeded max_allowed_packet; Increase max_allowed_packet on master;
这个错误是由于进入 master 时用的不是root 账号,所以查看的 master_log_file='mysql-bin.xxxxxx',master_log_pos=xxxx
这部分信息不对造成的:重新修改相关的信息:
stop slave;
change master to master_host='10.61.242.179',master_user='root',master_port=3306,master_password='123456',master_log_file='mysql-bin.000009',master_log_pos=56767;
start slave;
问题解决