Debian 8服务器设置MariaDB数据库主从复制(Master-Slave)
这篇教程介绍如何设置简单的MariaDB数据库主从复制."简单"的意思就是只有一个主服务器和一个从服务器.(one master and one slave),从服务器复制主服务器的数据.这篇教程的主服务器是Debian8 MariaDB 10.1版本,从服务器是树莓派Rapsbian Jessie系统MariaDB 10.1版本.后来在Ubuntu14.04服务器上又测试了一次,证明了只要MariaDB的版本一致,就可以按照下面的步骤实现主从复制.
MariaDB数据库主从复制的基本设置过程
MySQL和MariaDB的主从复制都依赖于二进制日志(binary log),主服务器必须开启二进制日志才能让主从复制工作.二进制日志主要用来备份数据库,恢复数据库,以及主从复制.从服务器不需要开启二进制日志,但MariaDB官方推荐在从服务器上开启二进制日志.
主从复制可以分为以下4步:
- 配置好主服务器(master )
- 配置好从服务器(slave)
- 将主服务器的数据库导入进从服务器
- 从服务器与主服务器连接,开始复制
第一步:配置主服务器(master)
编辑/etc/my.cnf文件
在主服务器上打开my.cnf配置文件,这个文件也被称为选项文件(option file).你的my.cnf文件也可能在/etc/mysql/目录下.
sudo nano /etc/my.cnf
找到[mysql]这一区域,在这一区域下面添加这5行选项.
log-bin = /var/log/mysql/master-bin
log-bin-index = /var/log/mysql/master-bin.index
binlog_format = mixed
server-id = 1
replicate-do-db = database_name
第一个选项log-bin的作用是启用二进制日志,并指定二进制日志文件存放在/var/log/mysql/目录下.master-bin是二进制日志文件名字的首部.
第二个选项log-bin-index指定了二进制日志索引文件的存放目录以及文件名.
第三个选项binlog_formt指定了二进制日志文件的格式为mixed(混合格式).二进制日志文件可以有3种格式:基于SQL语句的格式,基于行的格式,混合格式.混合格式是前两者的结合.在混合格式下,MariaDB优先使用基于SQL语句的格式,但当MariaDB认为一条SQL语句不适合主从复制时,它就使用基于行的格式来记录日志.
server-id用来区别主服务器和从服务器.
replicate-do-db的值是需要复制的数据库名称.如果需要复制多个数据库,那么使用多个replicate-do-db选项.比如复制两个数据库:
replicate-do-db=database_name1 replicate-do_db=database_name2
添加完以上5个选项后,保存文件,重启MariaDB数据库服务器.
sudo systemctl restart mariadb
你的my.cnf文件可能有bind-address = 127.0.0.1这个选项.bind-address = 127.0.0.1 的意思是只让MariaDB数据库服务器监听本地localhost.由于我们需要让从服务器远程登录主服务器,所以我们需要修改bind-address,将bind-address = 127.0.0.1这一行注释掉,重启MariaDB就可以了.
在主服务器上添加一个专门用于复制的用户
登录MariaDB主服务器.
mysql -u root -p
然后创建一个用户和密码,并赋予这个用户复制的权限(replication slave).
CREATE USER replication_user; set password for replication_user = password("your-password"); grant replication slave on *.* to replication_user identified by 'your-password'; flush privileges;
从服务器将以这个用户远程登录主服务器并请求二进制日志文件.
第二步:配置从服务器
打开my.cnf配置文件.
sudo nano /etc/my.cnf
在[mysqld]区域添加如下4行选项.
server-id = 2
relay-log-index = /var/log/mysql/slave-relay-bin.index
relay-log = /var/log/mysql/slave-relay-bin
replicate-do-db = database_name
当然,如果你要复制多个数据库,那么你需要添加多个replicate-do-db选项.保存文件,重启MariaDB.
sudo systemctl restart mariadb
有时候MariaDB可能会重启失败.使用systemctl status mariadb来查看MariaDB的状态.
第三步:主服务器导出数据库并导入从服务器
登录主MariaDB服务器,输入下面的命令保护数据库不再受更改.
flush tables with read lock;
然后查看master的状态.
show master status;
现在不要退出,记下File文件名以及Postion的值.打开另外一个终端,SSH登录主服务器,然后使用mysqldump来导出数据库.
导出一个数据库
mysqldump -u root -p db1 > db1.sql
导出多个数据库
mysqldump -u root -p --databases db1 db2 db2... > db.sql
使用scp命令将导出的sql文件传送到从服务器上,再导入进入从MariaDB数据库服务器.
在从服务器上导入数据库的命令:
mysql -u root -p < db.sql
导入完成后,在主MariaDB服务器上解开read lock.
MariaDB [(none)]> unlock tables;
第4步:从服务器与主服务器连接
登录从MariaDB服务器,运行下面的命令:
MariaDB [(none)]> change master to -> master_host='master IP address', -> master_user='replication_user', -> master_password='replication_user_password', -> master_port=3306, -> master_log_file='master-bin.000005', -> master_log_pos=215109, -> master_connect_retry=10;
红色部分是需要更改的.注意master_log_file与master_log_pos的值就是之前show master status这条命令所给出的两个值.
然后启动slave.
MariaDB [(none)]> start slave;
查看状态.
MariaDB [(none)]> show slave status\G;
Slave_IO_Running和Slave_SQL_Running的状态都为Yes就表示主从复制在正常运行.
如果主从复制出现问题,可以在状态里找出原因.停止主从复制的命令如下:
MariaDB [(none)]> stop slave;