在 Debian 8 上使用 MariaDB 10 复制主数据库
在此页
- 1。验证连通性
- 2。在 master 上启用 mysqld 二进制日志
- 3。授予复制用户权限
- 4。刷新数据库缓存并将表设置为只读
- 5。从属主机的快照数据库
- 6。配置主从服务器ID
- 8.在slave上配置master的身份 <李>9。激活从机
- 10。在 master 上进行更改,并在 slave 上验证复制
- 11。对其他从站重复此过程
- 12。故障排除:从站无法连接到主站
复制数据库会创建冗余,可以防止数据丢失,并允许优化应用程序的性能。本教程将涵盖将现有 MariaDB 10.0 主数据库复制到一个或多个从数据库的基础知识。在以下示例中,主机操作系统为 Debian 8。
这些说明可能适用于其他操作系统,但请注意,一些命令和默认文件位置会有所不同。具体来说,您应该替换 /etc/mysql/my.cnf、/var/lib/mysql 的路径名、二进制日志文件的默认名称和路径,以及根据您的系统具体情况启动、停止和重新启动 mysqld 的命令.
1. 验证连通性
在继续之前,确保主机和从机可以在网络上相互访问,并且每个主机在各自的 /etc/hosts 文件中都有另一个条目。每个主机都应该能够 ping 对方,并且您应该能够以普通用户的身份从每个主机到另一个主机。
2.在master上启用mysqld二进制日志
在 master 主机上,检查是否启用了二进制日志记录。使用开关 --verbose --help 调用 mysqld 将显示 MariaDB 守护进程的操作值。作为根:
mysqld --verbose --help | grep log-bin
...
log-bin (No default value)
...
条目 log-bin 的值定义了二进制日志文件的命名约定。在 Debian 上,这些文件位于 /var/lib 中。如果log-bin的值为(No default value),则需要通过修改配置文件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 | | |
+-------------------+----------+--------------+------------------+
您的信息会有所不同,但请记下 File 和 Position 的值。您将在第 7 步中使用此信息。
退出 MariaDB 客户端:
\q
5.从属主机的快照数据库
创建要复制的主数据库上存在的一个或多个数据库的存档。这些数据库中的每一个在 /var/lib/mysql 中都有自己的目录。在此示例中,我们将对位于路径 /var/lib/mysql/dbname 的单个数据库进行 tar。
此命令归档单个数据库。如果您要归档其他数据库,请将它们的完整路径名附加到命令中,例如/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
以 root 身份,停止从站上的 mysqld:
service mysql stop
...并提取档案:
tar xjvf /home/[username]/mysql-master.tar.bz2 -C /.
6.配置master和slave的server ID
修改 master 上的 /etc/mysql/my.cnf,在 [mysqld] 组中添加条目 server-id=n,其中 n 是一个唯一的整数,用于标识服务器。通常,主服务器的 n=1,但 n 可以是 [1, 2^32-1] 范围内的任何唯一整数。我们将我们的主人设置为 server-id=1,我们的奴隶设置为 server-id=100。
(如果 my.cnf 在从机上不存在,创建它。如果它存在,搜索现有的 server-id 条目,并取消注释/编辑该行)。
在 master 主机上的 /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
在 master 上重启 mysqld:
service mysql restart
并在奴隶上启动它:
service mysql start
您可以验证新的 server-id 值是否已在每个主机上生效。作为根:
mysqld --verbose --help | grep server-id
8.在slave上配置master的身份
在slave上,配置master服务器的身份。进入 MariaDB 客户端:
mysql -u root -p
执行以下命令,将 MASTER_LOG_FILE 和 MASTER_LOG_POS 的值替换为您在步骤 4 中记录的二进制日志文件和位置,并将 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.激活slave
在从服务器上,在 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. 在master上进行修改,在slave上验证复制
您可以通过在主服务器上创建一个新数据库并查看从服务器上的更改来验证复制是否正在发生。
mysql -u root -p
创建一个新的数据库:
CREATE DATABASE repltest;
USE repltest
创建一个表并插入一个值:
CREATE TABLE test (hello VARCHAR(10));
INSERT INTO test VALUES ('world');
\q
现在进入slave上的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 TABLES WITH READ LOCK;
锁定后,显示主控状态:
SHOW MASTER STATUS;
记下文件和位置值。
11(b)。在 master 上,以 root 身份:
tar cjvf /home/[username]/mysql-master.tar.bz2 /var/lib/mysql/dbname
11(c)。在 master 上,作为普通用户:
rsync -avP mysql-master.tar.bz2 [username]@slavehost2:~/.
11(d)。在奴隶上,作为根:
service mysql stop
tar xjvf /home/[username]/mysql-master.tar.bz2 -C /.
11(e)。在slave主机的/etc/mysql/my.cnf中,在[mysqld]组中添加或编辑server-id=这一行,其中server-id的值是新的且唯一的:
[mysqld]
server-id=200
11(f)。在 master 上,在 MariaDB 客户端中作为数据库根,解锁表:
UNLOCK TABLES;
11(克)。在 master 上,以 root 身份重启 mysqld:
service mysql restart
11(h)。在从服务器上,以 root 身份启动 mysqld:
service mysql start
11(一)。在从服务器上,在 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. 故障排除:Slave无法连接到master
检查 master 上的 /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