复制数据库创建冗余,可以防止数据丢失,并允许应用程序的优化性能。 本教程将介绍将现有MariaDB 10.0主数据库复制到一个或多个从站的基础知识。 在以下示例中,主机操作系统是Debian 8。
这些指令可能会应用于其他操作系统,但请注意,几个命令和默认文件位置将不同。 具体来说,您应该使用/etc/mysql/my.cnf,/ var / lib / mysql的路径名,二进制日志文件的默认名称和路径,以及根据系统的具体情况启动,停止和重启mysqld的命令。
验证连接
在继续之前,请确保主机和从机可以在网络上相互连接,并且每个主机和从机都可以在各自的/ etc / hosts文件中为另一个进入。 每个主机都应该可以ping另一个,你应该能够作为普通用户从每个到另一个ssh 。
2.在主机上启用mysqld二进制日志
在主主机上,检查二进制日志记录是否启用。 使用交换机--verbose --help调用mysqld将显示MariaDB守护程序的操作值。 作为根:
mysqld --verbose --help | grep log-bin
...
log-bin (No default value)
...
条目log-bin的值定义了二进制日志文件的命名约定。 在Debian上,这些文件驻留在/ var / lib中 。 如果log-bin的值为(无默认值) ,则需要通过修改配置文件my.cnf启用日志记录。 在Debian上, my.cnf驻留在目录/ etc / mysql中 。
在文本编辑器中打开/etc/mysql/my.cnf ,找到[mysqld]组。 如果不存在,创建它,并输入一个简单地读取log-bin的行 。
[mysqld]
log-bin
包括此条目将在重新启动mysqld时启用二进制日志记录。
您可以选择设置log-bin的值,例如log-bin = filename来定义二进制日志文件的自定义名称。 在本教程中,我们不会设置一个值,并将使用默认的日志文件名。
重新启动mysqld:
service mysql restart
验证更改是否生效:
mysqld --verbose --help | grep log-bin
...
log-bin mysqld-bin
...
如图所示,Debian上的默认二进制日志文件名开始为mysqld-bin ,例如mysqld-bin。 nnnnnn 。
3.授予复制用户的权限
最佳做法是让专用复制用户执行所有复制任务。 在这些示例中,我们将命名用户repluser并将此用户的密码设置为字符串replpass 。
授予该用户全局权限SUPER , RELOAD和REPLICATION SLAVE 。 这些将允许复制用户执行超级用户命令,刷新数据库高速缓存以及从主服务器获取更新。
输入MariaDB客户端作为数据库根目录:
mysql -u root -p
在MariaDB提示符下,输入命令:
GRANT SUPER, RELOAD, REPLICATION SLAVE ON *.* TO 'repluser'@'%' IDENTIFIED BY 'replpass';
这里,主机名通配符' % '允许复制用户从任何主机连接。
验证权利是否已被授予:
SHOW GRANTS FOR 'repluser'\G;
4.刷新数据库缓存并将表设置为只读
为准备数据库快照,请清除所有表并将其设置为READ LOCK 。 这应该在非高峰时段或系统维护期内快速完成。
主人:
FLUSH TABLES WITH READ LOCK;
现在表已锁定,请检查主控状态:
显示主状态
+-------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| mysqld-bin.000005 | 995 | | |
+-------------------+----------+--------------+------------------+
您的信息将不同,但请记下文件和位置的值。 您将在第7步中使用此信息。
退出MariaDB客户端:
\q
5.从主机的快照数据库
创建存在于主机上的要复制的数据库或数据库的存档。 每个这些数据库在/ var / lib / mysql中都有自己的目录 。 在这个例子中,我们将列出一个位于路径/ var / lib / mysql / dbname的单个数据库。
此命令归档一个数据库。 如果要归档其他数据库,请将完整的路径名追加到命令中,例如/ var / lib / mysql / dbname1 / var / lib / mysql / dbname2 ...
tar cjvf /home/[username]/mysql-master.tar.bz2 /var/lib/mysql/dbname
现在,作为普通用户名 ,将此文件传输到从主机上的普通用户帐户:
rsync -avP mysql-master.tar.bz2 [username]@slavehost:~/.
或者,使用scp:
scp mysql-master.tar.bz2 [username]@slavehost:~/.
然后,SSH到主机:
ssh [username]@slavehost
作为根,停止从站的mysqld:
service mysql stop
...并提取存档:
tar xjvf /home/[username]/mysql-master.tar.bz2 -C /.
6.配置主服务器和从服务器的服务器ID
在主机上修改/etc/mysql/my.cnf ,在[mysqld]组中添加条目server-id = n ,其中n是标识服务器的唯一整数。 通常,对于主服务器, n = 1,但n可以是范围[ 1,2 ^ 32-1 ]中的任何唯一整数。 我们将master设置为server-id = 1 ,我们的slave为server-id = 100 。
(如果从站上不存在my.cnf ,请创建它,如果存在,搜索现有的服务器id条目,取消注释/编辑该行)。
在主机上的/etc/mysql/my.cnf中:
[mysqld]
server-id=1
在从主机上的/etc/mysql/my.cnf中:
[mysqld]
server-id=100
7.解锁表并启动/重启主服务器和从设备上的mysqld
在主服务器上,在作为数据库根目录的MariaDB客户端中,解锁表:
mysql -u root -p
UNLOCK TABLES;
\q
重启主机上的mysqld:
service mysql restart
并从Minion开始:
service mysql start
您可以验证新的服务器ID值是否在每个主机上生效。 作为根:
mysqld --verbose --help | grep server-id
8.在从站上配置主站的身份
在从站上,配置主服务器的身份。 输入MariaDB客户端:
mysql -u root -p
执行以下命令,使用您在第4步中记录的二进制日志文件和位置 替换 MASTER_LOG_FILE和MASTER_LOG_POS的值,并使用您自己的值替换MASTER_HOST , MASTER_USER和MASTER_PASSWORD的值。
CHANGE MASTER TO MASTER_HOST='masterhost', MASTER_USER='repluser', MASTER_PASSWORD='replpass', MASTER_LOG_FILE='mysqld-bin.000005', MASTER_LOG_POS=995;
9.激活从站
在从属上,在MariaDB客户端中作为数据库根目录:
START SLAVE;
现在可以检查从站的状态:
SHOW SLAVE STATUS \G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: masterhost
Master_User: repluser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysqld-bin.000009
Read_Master_Log_Pos: 1330
Relay_Log_File: mysqld-relay-bin.000008
Relay_Log_Pos: 1618
Relay_Master_Log_File: mysqld-bin.000009
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 1330
Relay_Log_Space: 2204
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
Master_SSL_Crl:
Master_SSL_Crlpath:
Using_Gtid: No
Gtid_IO_Pos:
如果复制过程中有任何错误,您将在此处看到它们。
10.在主机上进行更改,并在从站上验证复制
您可以通过在主服务器上创建新的数据库并查看从服务器上的更改来验证是否正在进行复制。
mysql -u root -p
创建一个新的数据库:
CREATE DATABASE repltest;
USE repltest
创建一个表并插入一个值:
CREATE TABLE test (hello VARCHAR(10));
INSERT INTO test VALUES ('world');
\q
现在在Minion上输入MariaDB客户端:
mysql -u root -p
USE repltest
SELECT * FROM test;
+-------+
| hello |
+-------+
| world |
+-------+
1 row in set (0.00 sec)
11.对其他从站重复进程
您可以为每个附加从站重复此过程。 具体来说,请执行以下步骤:
11 ( a ) 。 在master上,在MariaDB客户端中作为数据库根,flush和lock表:
FLUSH TABLES WITH READ LOCK;
锁定后,显示主状态:
SHOW MASTER STATUS;
记下文件和位置值。
11 ( b ) 。 在主人身上,以root身份:
tar cjvf /home/[username]/mysql-master.tar.bz2 /var/lib/mysql/dbname
11 ( c ) 。 在主机上,正常用户:
rsync -avP mysql-master.tar.bz2 [username]@slavehost2:~/.
11 ( d ) 。 在Minion身上,以root身份:
service mysql stop
tar xjvf /home/[username]/mysql-master.tar.bz2 -C /.
11 ( e ) 。 在从主机上的/etc/mysql/my.cnf中,添加或编辑[mysqld]组中的server-id =行,其中server-id的值为新且唯一:
[mysqld]
server-id=200
11 ( f ) 。 在master上,在MariaDB客户端作为数据库root,解锁表:
UNLOCK TABLES;
11 ( g ) 。 在master上,以root身份重新启动mysqld:
service mysql restart
11 ( h ) 。 在slave上,以root身份启动mysqld:
service mysql start
11 ( i ) 。 在从属上,在作为数据库根目录的MariaDB客户端中,配置主标识,并从第10步(a)中配置二进制日志文件名和位置:
CHANGE MASTER TO MASTER_HOST='masterhost', MASTER_USER='repluser', MASTER_PASSWORD='replpass', MASTER_LOG_FILE='mysqld-bin.nnnnnn’, MASTER_LOG_POS=n;
11 ( j ) 。 在从属上,在作为数据库根目录的MariaDB客户端中,激活复制:
START SLAVE;
12.故障排除:从站无法连接到主站
在主机上检查/var/mysql/my.cnf以获取绑定地址条目。 如果bind-address设置为127.0.0.1 ,服务器将只接受本地主机的连接。 注释掉该行,或将值设置为*以允许所有IPv4和IPv6地址的连接。 如果修改my.cnf ,不要忘记重新启动mysqld。
如果连接仍然不起作用,请确保您的服务器允许端口3306上的连接。 在主机上列出内核防火墙表:
iptables -L
您可以使用以下命令在端口3306上创建连接余量,根据需要将您的网络接口设备名称替换为eth0 :
iptables -A INPUT -i eth0 -p tcp --destination-port 3306 -j ACCEPT