MySQL 的主从复制配置

大型项目对备份尤为关注,一般有双机备份,热备冷备,异地灾备等等… 今天来说一下两台服务器上的 MySQL 主从复制备份,需求比较简单:从要同步主的数据,但也不用太频繁,保持 15 分钟的数据差即可,意思就是每 15 分钟去同步一次修改过的数据。开干!

我们这里环境是两台 Linux 服务器,一台在公网,一台在内网,公网是主,内网是从,数据库都是 MySQL 5.7(使用 LNMP 安装)。

主库操作

首先我们先新建一个数据同步用户,让从库使用这个用户可以来同步数据

CREATE USER 'slave'@'%' IDENTIFIED BY '密码';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';

百分号代表该用户可以在任意 IP 登录。

然后我们需要把主库备份下来,如果你的库此时并没有访问,那么可以不用锁表,但最好先锁表再备份

mysql> flush tables with read lock;

使用 mysqldump 备份需要同步的库,我这里是同步 mikublog 这个库

mysqldump -uroot -p --databases mikublog | gzip > mysql_bak.$(date + %F)sql.gz

备份好之后记录一下当前位置,记住 File 和 Position 的值

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000014 |      154 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

最后解锁表

mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)

从库操作

把刚刚备份的压缩包拷贝过来,并解压:gzip -d 压缩包名字,然后把 sql 刷到数据库里去。

修改 my.cnf,一般只需要改两个值,把 server-id 改为唯一值

[mysqld]
log-bin=mysql-slave-bin
server-id   = 2

改好之后重启数据库

service mysql restart

设置主从配置

mysql> change master to master_host='192.168.100.110', master_user='slave', master_password='mypassword', master_port=3306, master_log_file='mysql-bin.000014', master_log_pos= 154, master_delay=900, master_connect_retry=30;

各参数含义:

master_host :主库的地址

master_port:主库的端口号

master_user:用于数据同步的用户

master_password:用于同步的用户的密码

master_log_file:指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值

master_log_pos:从哪个 Position 开始读,即上文中提到的 Position 字段的值

master_delay:延迟复制配置,设置从数据库延时 N 秒后,再与主数据库进行数据同步复制

master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是 60 秒

开启主从复制

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

查看同步状态

mysql> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                             ...
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
                             ...
1 row in set (0.00 sec)

SlaveIORunning 和 SlaveSQLRunning 都是 Yes 说明主从复制已经开启。

完美~

 

感谢:
https://segmentfault.com/a/1190000023408446

发表评论

发表评论

*

沙发空缺中,还不快抢~