mysql复制原理,推荐一本书《高清中文第三版-高性能mysql》第十章
网盘下载地址:高清中文第三版-高性能mysql-pdf 网盘
现状:两个云主机,都是阿里云一
前期准备
将主服务的现有数据导入到从服务中,并确保在配置时两个库都没有任何操作
简单粗暴就是上锁
FLUSH TABLES WITH READ LOCK;
确保能相互ping通,且3306端口已经开放
主上新建一个用户,指定只能让从连接
grant replication slave on *.* to 'username'@'47.98.xx.xx' identified by 'password';
开启主服务器的 binarylog
修改主服务器的mysql配置文件
vi /etc/my.cnf
在[mysqld]
下新增如下内容
log-bin = master-bin.log
binlog-format = mixed
server-id = 2
binlog-do-db=suntree_cmp_test #需要复制的数据库名称,可以有多个
relay_log=mysql-relay-bin
log-slave-updates = ON
lower_case_table_names = 1 #忽略表大小写
重启mysql服务
service mysqld restart
或者
systemctl stop mysqld.service
systemctl start mysqld.service
然后登陆主库mysql,
show master status\G
记住File和Position两项,待会儿配置从库要用到
配置从库
vi /ect/my.cnf
在mysqld
下面添加
log-bin = master-bin.log #和主机相同
binlog-format = mixed
server-id = 1 #切记不能与主机相同
#如果是需要忽略哪些数据库,操作如下
#binlog-ignore-db=mysql
#如果是关注哪些数据库
binlog-do-db=suntree_cmp_test
expire_logs_days = 7 #超过7天的binlog删除
修改配置,也是需要重启mysql服务
然后登陆从库,在从数据库上配置连接主数据库配置,指定复制使用的账号/密码,主服务器的 ip、端口、以及日志文件及 pos 位置等
CHANGE MASTER TO
MASTER_HOST='119.23.xxx.xxx',
MASTER_USER='username',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=107;
MASTER_LOG_FILE对应主库show master status\G
的File值
MASTER_LOG_POS对应主库show master status\G
的pos值
配置好后,从数据库上启动 slave 进程,让从数据库的 I/O 和 SQL 线程生效
mysql> start slave
可以看一下slave线程是否启动成功
双yes就说启动成功,然后修改主库数据,从库就会同步
如果有任何一个NO就需要去看日志,日志位置
show variables like 'log_%';
然后根据erroe日志,具体问题具体分析
可能的错误
密码错误、主从MASTER_LOG_FILE、MASTER_LOG_POS不一致,因为如果重启数据库这两个值可能会改变
如果条件允许,主从数据库版本最好一致,避免一些无法预知的错误