前提

已有两台服务器,一台服务器上已有单机数据库,现需要在另外一台服务器上配置从库,以已有库为主库实现主从同步。

  • 两台服务器数据库端口对外网开放
  • 主库ip为192.168.0.1
  • 从库ip为192.168.0.2

主库开启binlog

配置文件[mysqld]下添加如下内容后,重新启动主库。

[mysqld]
log-bin
server-id=1

创建从库同步授权账号

CREATE USER 'username'@'192.168.0.2' IDENTIFIED BY 'password';
grant replication slave, replication client on *.* to 'username'@'192.168.0.2';
flush privileges;

mysqldump备份主库数据

主库锁表并查看状态

flush table with read lock;
show master status;

image-20220211115559866

备份主库数据

mysqldump  -h192.168.0.1 -P3306 -uusername -ppassword -A -B --events --master-data=2 > /db-$(date +%F)-all.sql

主库取消锁表

unlock tables;

从库启动并导入主库备份数据

docker-compose启动从库

docker-compose.yml文件如下

version: '3'
services:
  #服务名称
  mysql:
   #容器名称
   container_name: mysql-5.7.30
   #镜像名称
   image: mysql:5.7.30
   #自动启动
   restart: always
   #端口映射
   ports:
     - "3306:3306"
   #环境变量
   environment:
     - MYSQL_ROOT_PASSWORD=rootpassword
     - MYSQL_USER=commonuser
     - MYSQL_PASS=commonpassword
   #挂载
   volumes:
     - /home/ubuntu/docker-iamges/mysql-5.7.30/conf.d:/etc/mysql/conf.d
     - /home/ubuntu/docker-iamges/mysql-5.7.30/logs:/logs
     - /home/ubuntu/docker-iamges/mysql-5.7.30/data:/var/lib/mysql
     - /home/ubuntu/docker-iamges/mysql-5.7.30/query-logs:/query-logs
     - /etc/timezone:/etc/timezone
     - /etc/localtime:/etc/localtime

mysql配置文件如下

[mysqld]
server-id=2

default-time_zone='+8:00'

slow_query_log = 'ON'
#需要授予映射容器外部目录下对应slow.log权限给数据库用户
slow_query_log_file = /query-logs/slow.log
long_query_time = 1

docker启动容器

docker-compose up -d

进入容器命令行并恢复主库备份数据

#进入mysql容器
docker exec -i -t mysql-5.7.30 /bin/bash
#恢复备份数据
mysql -uroot -prootpassword  </db-2022-02-11-all.sql

从库指定开始同步位置并开启同步

change master to master_host='192.168.0.1', master_port=3306, master_user='synclog', master_password='synclog0211sqlgo', MASTER_LOG_FILE='binlog.000009', MASTER_LOG_POS=441;
start slave;

查看主库和从库状态

#查看主库状态
show master status;
#查看从库状态
show slave status;