数据库复制 在多数IT人士看来,也经常会把它同多份相同数据的拷贝相关联,以保证在系统硬件故障以及数据损坏时不会丢失数据。在某种程度上来讲,这种概念是正确的,但是实际的数据库复制却比它具有更加丰富的内涵,几乎涉及数据库备份和高可用的各个环节。
在具备主从数据库复制的系统中,我们需要着重提及以下几点优势:
- 从属数据库的备份操作不影响也不受主数据库服务器写操作的影响
- 资源密集型操作(例如数据分析)可以在从属服务器上执行,而不影响主服务器的整体性能
本文将详细讲解如何设置MariaDB 10.3 主从数据库复制系统。与传统的数据库复制不同的是,MariaDB 自10.0版本后引入了全局事务ID(GTIDs)的概念,这让从属服务器在不同主服务器间进行数据复制时变得更加容易;除此之外,对于从属状态的记录也会采用更为安全的方式(对状态的更新和对数据的更新在同一事务中完成)。
1] CentOS/RHEL 7 和 Debian 9 系统安装MariaDB 10.3
本教程使用的实验环境将包含两台主机,均采用CentOS 7:
Master: 172.16.200.1 Slave: 172.16.200.2
为了安装最新版的MariaDB,需要在服务器添加相应的软件库。如果已经使用了旧版本的MariaDB数据库,可以参照本教程卸载之前的数据库再进行安装。
CentOS/RHEL 7系统
同时在”Master”和”Slave”主机上的”/etc/yum.repos.d”目录添加一个名为”MariaDB.repo”的文件,文件内容如下:
# MariaDB10.3CentOSrepositorylist-created2019-05-2407:18UTC # http://downloads.mariadb.org/mariadb/repositories/ [mariadb]name = MariaDB baseurl = http://yum.mariadb.org/10.3/centos7-amd64 gpgkey = https://yum.mariadb.org/RPM-GPG-KEY-MariaDB gpgcheck = 1
保存文件后使用在每台服务器均使用”yum”命令安装MariaDB数据库软件包:
# yum install MariaDB-server MariaDB-client
Debian 系统
使用如下命令将软件包密钥和MariaDB包添加到软件库:
# apt-get install software-properties-common dirmngr # apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xF1656F24C74CD1D8 # add-apt-repository 'deb [arch=amd64,i386,ppc64el] http://mirrors.tuna.tsinghua.edu.cn/mariadb/repo/10.3/debian stretch main'
以上命令使用的是清华大学镜像软件库,当然也可以采用其它镜像。对于采用”https”文件传输的镜像,需要首先执行如下命令以免出错:
# apt-get install apt-transport-https
最后,执行以下命令安装MariaDB:
# apt-get update # apt-get install mariadb-server
数据库安装完成后,使用mysql_secure_installation
程序进行数据库安全性设置。
图.1 MariaDB主从服务器信息
2] 在Master主机创建一个示例数据库
为演示起见,我们将创建一个名为”employees” 的数据库,将如下内容保存为”employees.sql”文件:
DROP DATABASE IF EXISTS employees; CREATE DATABASE IF NOT EXISTS employees; USE employees; SELECT 'CREATING DATABASE STRUCTURE' as 'INFO'; DROP TABLE IF EXISTS employees; CREATE TABLE employees ( emp_no INT NOT NULL, birth_date DATE NOT NULL, first_name VARCHAR(14) NOT NULL, last_name VARCHAR(16) NOT NULL, gender ENUM ('M','F') NOT NULL, hire_date DATE NOT NULL, PRIMARY KEY (emp_no) );
然后执行如下命令:
# mysql -u root -p < employees.sql
如果未出现错误的话,示例数据库就创建完成了。
3] 配置主用MariaDB 数据库启用数据库复制
按照如下步骤配置MariaDB主用服务器。
步骤1. 修改配置文件”/etc/my.cnf.d/server.cnf”,在”[mysqld]”章节添加如下内容:
log-bin server_id=1 replicate-do-db=employees bind-address=172.16.200.1
修改好配置后,使用如下命令重新启动MariaDB服务:
# systemctl restart mariadb
步骤2. 以 root 用户登录到主用服务器,创建从属服务器用户并对其进行授权:
MariaDB [(none)]> CREATE USER 'slave'@'localhost' IDENTIFIED BY 'slave'; MariaDB [(none)]> GRANT REPLICATION SLAVE ON *.* TO slave IDENTIFIED BY 'slave' WITH GRANT OPTION; MariaDB [(none)]> FLUSH PRIVILEGES; MariaDB [(none)]> FLUSH TABLES WITH READ LOCK; MariaDB [(none)]> SHOW MASTER STATUS;
最后一条命令”SHOW MASTER STATUS”返回二进制日志文件的当前位置,即从服务器复制的起始位置。
图.2 查看主用服务器状态
步骤3. 退出MariaDB数据库,使用如下命令对”employees”数据制作一个备份快照:
# mysqldump -u root -p employees > employees.dump
快照制作完成后,重新登录数据库,使用如下命令打开表锁定:
MariaDB [(none)]> UNLOCK TABLES;
步骤4. 使用如下命令将快照文件拷贝到从属服务器:
# scp employees.dump root@172.16.200.2:/root/
步骤5. 运行”mysql_upgrade”命令更新系统表:
# mysql_upgrade -u root -p
步骤6. 主用服务器打开防火墙允许MariaDB数据库:
# firewall-cmd --add-service=mysql # firewall-cmd --add-service=mysql --permanent # firewall-cmd --reload
以上就完成了主用服务器的配置,下面我们将配置从属服务器。
4] 配置MariaDB从属服务器
配置从属服务器需要经过如下步骤。
步骤1. 登录MariaDB数据库,创建操作复制的用户:
# mysql -u root -p MariaDB [(none)]> CREATE USER 'slave'@'localhost' IDENTIFIED BY 'slave';
步骤2. 登录成功后,使用如下命令创建复制数据库并进行授权:
MariaDB [(none)]> CREATE DATABASE employees; MariaDB [(none)]> GRANT ALL PRIVILEGES ON employees.* TO 'slave'@'localhost' WITH GRANT OPTION; MariaDB [(none)]> FLUSH PRIVILEGES;
步骤3. 将快照数据导入数据库:
# mysql -u root -p employees < employees.dump
步骤4. 修改配置文件”/etc/my.cnf.d/server.cnf”,为从属服务器分配ID。注意我们之前已经将1分配给主用了服务器,此时需要为从属服务器分配其它ID值。同样在”[mysqld]”章节增加如下内容:
server_id=2 replicate-do-db=employees
修改完成后重新启动MariaDB数据库以使配置生效:
# systemctl restart mariadb
步骤5. 执行mysql_upgrade
命令更新系统表:
# mysql_upgrade -u root -p
步骤6. 一旦数据库快照成功导入从属服务器,我们就可以通过简单几步进行数据库复制了。登录数据库后,在MariaDB命令提示符下输入如下命令设置主用服务器。需要特别注意的是,”MASTER_LOG_FILE” 和 “MASTER_LOG_POS” 设定值要与之前在主用服务器上”SHOW MASTER STATUS” 输出的值一致,以免出错:
MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='172.16.200.1', MASTER_USER='slave', MASTER_PASSWORD='slave', MASTER_PORT=3306, MASTER_LOG_FILE='master-bin.000001', MASTER_LOG_POS=808, MASTER_CONNECT_RETRY=10, MASTER_USE_GTID=current_pos;
步骤7. 在MariaDB命令提示符下启动从属服务器并查看状态:
MariaDB [(none)]> START SLAVE; MariaDB [(none)]> SHOW SLAVE STATUS\G;
如果查看从属服务器状态时出现任何报错信息,以根据其内容进行相关故障排查,没有报错则说明数据库复制准备就绪。
当然,想要停止从属服务也很简单,只需要在MariaDB命令提示符下输入如下命令即可:
MariaDB [(none)]> STOP SLAVE;
5] 验证MariaDB数据库复制功能
首先在主用服务器插入一条记录:
MariaDB [(none)]> USE employees; MariaDB [employees]> INSERT INTO employees (emp_no, birth_date, first_name, last_name, gender, hire_date) VALUES (500000, '1990-01-01', 'Rultr', 'Null', 'M', '2018-12-12');
之后,在从属服务器查询该数据库,看在主用服务器上添加的记录是否已经自动复制到从属服务器:
MariaDB [(none)]> USE employees; MariaDB [employees]> SELECT * FROM employees WHERE emp_no=500000;
结果如下图所示:
图.3 验证MariaDB数据库复制功能
可以看到,在主用主机上所做的数据库操作会被同时复制到从属服务器上,MariaDB数据库复制功能工作正常。