mariadb单机多实例主从复制
准备工作:
停掉数据库服务:
systemctl stop mariadb.service
将主库的数据库文件拷贝一份作为从库数据:
cp -a -r /data/mysql_data/mysql/* /data/mysql_data/mysql2/
拷贝完启动:
systemctl start mariadb.service
步骤1:配置主库和从库多实例的cnf文件
主库和从库共用一个cnf文件, /etc/my.cnf
[mysqld]
log-bin=mysql-bin-log
server-id=1
datadir=/data/mysql_data/mysql
socket=/data/mysql_data/mysql/mysql.sock
innodb_flush_log_at_trx_commit=1
sync_binlog=1
pid-file=/run/mariadb/mariadb.pid
注意:为了使用事务的InnoDB在复制中最大的持久性和一致性,你应该指定innodb_flush_log_at_trx_commit=1,sync_binlog=1选项
[mysqld3307]
port=3307(单机多实例必须指定不同于3306的端口)
log-bin=mysql-bin-log
server-id=2 (不同于主库实例的id)
datadir=/data/mysql_data/mysql2
socket=/data/mysql_data/mysql2/mysql3307.sock
pid-file=/run/mariadb/mariadb3307.pid
步骤2:创建一个复制权限的账号:
mysql会赋予一些特殊的权限给复制线程,在备库运行的I/O线程会建立一个到主库的
TCP/IP连接,这意味着必须在主库创建一个用户,并赋予其合适的权限,备库I/O线程以该用户名连接到主库并读取其二进制日志,
创建用户账号语句:
mysql> CREATE USER repl@127.0.0.1;
mysql> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.*
-> TO repl@'127.0.0.1' INDENTIFIED BY 'repl';
我们再主库和备库都创建该账号,注意我们把这个账户限制在本地网络,因为这是一个特权账号(尽管该账号无法执行select或修改数据,但仍然能从二进制日志中获得一些数据)
步骤3:锁定主机,注意二进制日志的位置并备份主机数据库
在主机上执行FLUSH TABLES WITH READ LOCK语句来刷新所有的表并阻断写操作:
master> FLUSH TABLES WITH READ LOCK;
当FLUSH TABLES WITH READ LOCK中的读操作锁生效时,用以下命令在主机读取当前的二进制日志名称和偏差的值:
master> SHOW MASTER STATUS;
File: mysql-bin-log.000001
Positin: 1234
该命令显示列出了当前主库使用的binlog文件名File,和日志在文件中的偏差量Position,这两个参数在后面设置从库的时候会用到。它们代表了从库什么时候开始处理新的更新的坐标。
注意:如果之前主机没有开启bin-log功能,用SHOW MASTER STATUS命令显示的日志文件和position值为空,如果是这种情况,那么你后面要在从机日志里面指定的名称和positon值应该是空字符串('')和4.
接下来,继续在主库客户端窗口执行 FLUSH TABLES WITH READ LOCK;
注意:你可以使用以下命令在主机上重新打开写操作功能:
master> UNLOCK TABLES;
步骤4:初始化复制
连接从库:mysql -S /data/mysql_data/mysql2/mysql3307.sock
现在我们准备好在从库实例上初始化复制了。在从库实例上执行以下命令:
slave> SLAVE STOP;
接着,你要输入一条CHANGE MASTER 命令:
slave> CHANGE MASTER TO MASTER_HOST='127.0.0.1',
-> MASTER_USER='repl',
-> MASTER_PASSWORD='repl'
-> MASTER_LOG_FILE='mysql-bin-log.000001',
-> MASTER_LOG_POS=1234;
参数含义:
- MASTER_HOST:主库的ip
- MASTER_USER:步骤2中授予REPLICATION SLAVE权限的用户
- MASTER_PASSWORD:repl用户的密码
- MASTER_LOG_FILE:show master status中的文件名
- MASTER_LOG_POS: show master status中的position
最后在从库实例上开始复制:
slave> start slave;
步骤5:基础检查
进行数据插入来检验是否复制成功
也可以用下面的命令检查状态:
mysql> SHOW SLAVE STATUS\G;
mysql> SHOW PROCESSLIST\G;