MySQL数据库支持同步复制、单向、异步复制,在复制的过程当中一个服务器充当主服务,而一个或多个服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志能够记录发送到从服务器的更新。当一个从服务器链接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,而后封锁并等待主服务器通知新的更新。html
注意:当你进行复制时,全部对复制中的表的更新必须在主服务器上进行。否避免用户对主服务器上的表进行的更新与对从服务器上的表所进行的更新之间的冲突。java
MySQL复制基于主服务器在二进制日志【binlog】中跟踪全部对数据库的更改(更新、删除等)。所以,复制必须在主服务器上启用二进制日志,每一个从服务器从主服务器接收主服务器已经记录到其二进制日志【relaylog】的保存的更新,以便从服务器能够对其数据拷贝执行相同的更新。mysql
[主服务器:192.168.25.136] [从服务器:192.168.25.144]sql
在主服务器136上查看主状态以最新的服务器状态为准,在从服务器配置shell
mysql -uroot -proot
show master status\G
第一行代表 当前正在记录的 binarylog文件名是: mysql-bin.000001.数据库
第二行,810 表示当前的文件偏移量, 就是写入在mysql-bin.000001 文件的记录位置。vim
第三行和第四行,表示须要记录的数据库和须要忽略的数据库。 只有须要记录的数据库,其变化才会被写入到mysql-bin.000001日志文件中。服务器
注意:若是显示"Empty Set",则须要检查是否开启了bin文件(小规模文件my-small.cnf默认不开启,本博客的mysql配置以small为准,所以需修改)异步
sed -i 's/#log-bin=mysql-bin/log-bin=mysql-bin/g' /etc/my.cnf
在主服务器136上面建立专门用于备份的用户double测试
GRANT REPLICATION SLAVE ON *.* TO 'double'@'192.168.25.144' IDENTIFIED BY 'double';
开启主服务器136的 binarylog
vim /etc/my.cnf
# 添加以下内容 binlog_format=mixed binlog-ignore-db=mysql auto-increment-offset=1 auto-increment-increment=3 注:binlog-ignore-db 表示,须要忽略哪些数据库。我这里忽略了其余的4个数据库。 假设须要未来可能须要3台服务器作备份, 因此auto-increment-increment 设为3. 而 auto-increment-offset=1 表示这台服务器的序号从1开始, 不超过auto-increment-increment。这样作以后, 我在这台服务器上插入的第一个id就是 1, 第二行的id就是 4了, 而不是2.
重启136服务器的mysql服务
service mysqld restart ==>/etc/inint.d/mysqld restart
获取主服务器136状态
若是是全新安装的, 那么不须要同步初态,直接跳过这一步,到后面直接查看主服务器状态。
若是已经有了一个数据库ftl数据库做为初态。
先锁定 hello数据库: flush tables with read lock; 而后导出数据: mysqldump -uroot -proot ftl -B -x> /tmp/ftl.sql 查看A服务器的binary日志位置 show master status\G 记住这个文件名和 位置, 等会在从服务器上会用到 解除锁定了 unlock tables;
设置从服务器 144须要复制的数据库
修改从服务器的server_id
sed -i 's/server-id.*1/server-id = 2/g' /etc/my.cnf
修改: vim /etc/my.cnf
# 添加以下内容 relay-log = relay-log replicate-ignore-db=information_schema replicate-ignore-db=performance_schema
注:replicate-ignore-db 复制时须要排除的数据库。除开系统的几个数据库以外,全部的数据库都复制。
relay_log 中继日志的名字。 前面说到了, 复制线程须要先把远程的变化拷贝到这个中继日志中, 再执行。
log-slave-updates 意思是,中继日志执行以后,这些变化是否须要计入本身的binarylog。 当你的B服务器须要做为另一个服务器的主服务器的时候须要打开。 就是双主互相备份,或者多主循环备份。 咱们这里须要, 因此打开。
重启144服务器的mysql服务
service mysqld restart ==>/etc/inint.d/mysqld restart
查看从服务器的server_id
mysql -uroot -proot SHOW VARIABLES LIKE 'server_id'; # 显示跟配置一致便可,前面咱们设置2
从服务器测试主服务器的注册的double用户是否正常
mysql -h 192.168.2.144 -udouble -pdouble
在从服务器144上导入主服务器136的初态
scp root@192.168.25.144: /tmp/ftl.sql /tmp/ftl.sql mysql -uroot -proot < /tmp/ftl.sql [没有添加库名,是由于备份的时候使用了-B,里面还有自动建库的语句]
开启同步, 在从服务器144服务器上执行
CHANGE MASTER TO MASTER_HOST='192.168.25.136', # 主服务器IP MASTER_USER='double', MASTER_PASSWORD='double', # 主服务器设置的用户 MASTER_LOG_FILE='mysql-bin.000001', # 根据主服务器看 : show master status\G 里面的 File MASTER_LOG_POS=2702; # 根据主服务器查看; show master status\G 里面的 Position
从服务器重启mysql服务, 而后查看slave线程是否正常
上面几个参数要跟上面的保持一致,并且IP尽可能用补全,除非在局域网环境,多台备份服务器
若是其中一个是No, 那就说明不成功。须要查看mysql的错误日志[/usr/local/mysql/data/*.err]
密码,防火墙,ip地址不对等都会致使失败,查看日志文件便可
主从复制结果
在主服务器的ftl数据库的user表中 连续插入了3条数据, 查看从服务器是否同步数据了