[Linux]MySQL主从同步复制

步骤1–配置主数据库主属性

修改my.cnf配置文件,修改log_binbinlog-do-dbserver_id属性,log_bin指定日志文件的命名;binlog-do-db指定需同步的数据库名,不指定的情况下同步所有数据库;server_id指定数据库唯一id。如:

1
2
3
4
[mysqld]
log_bin = mysql-bin
binlog-do-db=ycpaidb
server_id = 1

如果这个主数据库是其他另外数据库的从数据库,也就是说需要实现级联(链式)主从复制,则需添加以下属性,来表明开启从数据库日志,实现级联(链式)复制

1
2
[mysqld]
log-slave-updates=1 #启用从库日志,这样可以设置链式复制

步骤2–重启主数据库

其中mysql为服务名称,根据/etc/init.d/中对应的数据库服务名,可能为mysqldmysqlmysql.server。重启完毕后能在data目录下看到mysql-bin.000001的同步所需文件,每重启一次数据库,则文件会新增一个,后缀数字将会自动加1。

1
shell> service mysql restart

使用账号密码登录mysql命令行,执行以下命令,就能看到当前数据库的主属性信息

1
mysql> show master status\G;

结果截图如下图(为保护数据安全,进行了数据库名打码):

show master status\G

步骤3–在主数据库新建slave权限的账号

一般来说会新建一个只有slave权限的账号供主从同步使用,当然使用其他高权限账号,如root也是可以,不过怎么说也是不够安全。

使用账号密码登录mysql命令行,执行以下命令,新建slave权限的账号:

1
2
mysql> create user 'username'@'host' identified by 'password';
mysql> grant replication slave on databasename.tablename to 'username'@'host';

其中host的通配符为,表示所有ip都能连接;databasenametablename通配符为*

查看账号权限可用以下命令:

1
mysql> show grant for 'username'@'host';

步骤4–备份主数据库

执行下列命令备份主数据库,用户从数据库的初始化

1
shell> mysqldump -u[数据库用户名] -p[数据库密码] [数据库名] > [导出路径]

使用tail命令查看备份数据文件的最后几行,获取当前备份文件的备份时间,这个时间很重要,需要靠这个时间来确认从数据库的起始同步点,结果如图:

备份文件时间

步骤5–配置从数据库从属性1

修改my.cnf配置文件,修改server_id,可选修改log_binbinlog-do-db属性。这里的server_id表示数据库的独特标识,所以不能主数据库的server_id相同,如:

1
2
[mysqld]
server_id = 2

步骤6–重启从数据库(同步骤2)

其中mysql为服务名称,根据/etc/init.d/中对应的数据库服务名,可能为mysqldmysqlmysql.server

1
shell> service mysql restart

步骤7–从数据库初始化

把步骤3备份出来的数据库文件导入到从数据库主机中,我这边是是用scp命令,由于是内网,所以速度会非常快。

1
shell> scp [主数据库备份文件路径] [从数据库主机用户名]@[从数据库主机IP(或域名)][从数据库主机将要存放备份文件目录]

使用账号密码登录mysql命令行,执行以下命令,导入数据库文件到从数据库,以完成从数据库的数据初始化。当然,前提是已经建好了对应的数据库

1
2
mysql> use [数据库名];			// 进入指定数据库
mysql> source [数据库文件目录]; // 导入数据库文件

步骤8–根据主数据库的binlog文件确认同步点

当前主数据库的binlog文件为mysql-bin.000006

根据步骤4获取到的备份文件时间,现在就用上了。我们需要依靠这个备份文件时间来获取同步点,即需要查看主数据库binlog文件获取备份文件时间后第一个操作的时间节点,其对应的pos值就是我们所需的同步点。

执行以下命令查看binlog文件在备份文件时间前后约半个小时内的操作记录。由于备份文件时间为2016-07-08 17:15:42,所以前后大概查看2016-07-08 17:00:002016-07-08 17:30:00这段时间。当然这段时间是任意设置的,甚至可以查看所有操作记录,慢慢一个个挨着找。

1
shell> /usr/local/mysql/bin/mysqlbinlog --start-datetime="2016-07-08 17:00:00" --stop-datetime="2016-07-08 17:30:00 mysql-bin.000006"

由于编码和binlog编码不一样,导致了以下的错误:

binlog查看失败错误

这个时候添加参数--no-defaults即可:

1
shell> /usr/local/mysql/bin/mysqlbinlog --no-defaults --start-datetime="2016-07-08 17:00:00" --stop-datetime="2016-07-08 17:30:00" mysql-bin.000006

接着在结果中慢慢找到刚小于2016-07-08 17:15:42和刚大于2016-07-08 17:15:42的位置:

pos位置

接着就得出214497149就是为同步点

步骤9–配置从数据库从属性2

步骤5中的从属性是配置mysql配置文件my.cnf的,而这里是对数据库内容进行配置。

使用账号密码登录mysql命令行,执行以下命令,配置从属性:

1
2
3
mysql> change master to master_host='[主数据库IP]',master_user='[步骤3新建的slave权限账号名]',master_password='[步骤3新建的slave权限账号密码]',
master_log_file='[步骤8说明的binlog文件名(这里为 mysql-bin.000006)]',master_log_pos=[步骤8获取的同步点(这里为214497149)];
mysql> start slave; // 启动从数据库的从同步复制服务

使用以下命令可查看从同步复制服务的状态:

1
mysql> show slave status\G;

至此,主从复制就配置完成了。

(•̀ᴗ•́)و ̑̑

Share