空树之空

发布:admin2026-01-11 09:47:13 7110条浏览分类:世界杯直播网

MySQL 主从极简教程April 22, 2024字数:

2014

·

阅读:

10 分钟

·

访问:

-mysql极简教程1. 什么是 MySQL 主从同步2. 主从原理3. 主从配置参数3.1. server_id3.2. log_bin3.3. sync_binlog3.4. relay_log3.5. log_slave_updates3.6. read_only3.7. sync_master_info3.8. sync_relay_log3.9. sync_relay_log_info3.10. expire_logs_days3.11. max_binlog_size3.12. binlog_format3.13. 实例配置4. 主从常用命令5. 测试数据6. 主从同步(docker)6.1. 准备6.2. 主库6.3. 从库6.4. 停止主从同步6.5. 删除 mysql7. 一主多从同步(docker)7.1. 准备7.2. 主库7.3. 从库017.4. 从库027.5. 停止主从同步7.6. 删除 mysql8. 主从(主)从部署(docker)8.1. 准备8.2. 主库8.3. 从库018.4. 从库028.5. 停止主从同步8.6. 删除 mysql9. 主从同步(docker-compose)9.1. 准备9.2. 配置9.3. 创建 docker-compose9.4. 启动服务9.5. 设置主从同步9.6. 停止主从同步9.7. 重启服务9.8. 删除 mysql10. 主从同步(docker-compose自动)10.1. 准备10.2. 配置10.3. 自动脚本10.4. 创建 docker-compose10.5. 启动服务10.6. 查看主库状态10.7. 查看从库状态10.8. 停止主从同步10.9. 重启服务10.10. 删除 mysql11. mysqldump 导出12. 参考1. 什么是 MySQL 主从同步MySQL主从同步,也称作MySQL复制,是数据库管理中的一个核心特性,它允许你从一个MySQL数据库服务器(称为主服务器)复制数据到一个或多个MySQL数据库服务器(称为从服务器)。复制过程是异步的,并且通常实时进行,所以从服务器的数据是对主服务器数据近似实时的镜像。

这项技术主要用于以下几个目的:

数据备份:在从服务器上持有主服务器数据的副本,可以在主服务器故障时避免数据丢失。 故障切换(Failover):当主服务器宕机时,可以快速切换至从服务器,保证服务的持续可用。 负载均衡:通过从服务器处理读请求,可以减轻主服务器的负载。 数据分析和报告:在从服务器上运行查询,可以减少对主服务器操作产生影响。 地理分布:将数据复制到不同地理位置的服务器上,可以提高用户访问数据时的速度和可靠性。MySQL主从复制是一种强大的特性,它可以在不同的用例中使用,以提高数据的可用性和可靠性,同时提供系统和数据的可伸缩性。这对于任何规模的企业环境都是不可或缺的。

2. 主从原理主服务器上的操作:主服务器将所有的更改操作记录到二进制日志(binary log)中。这些日志是复制的基础,包含了所有可能影响数据的SQL语句。日志传送和读取:从服务器连接到主服务器,并从二进制日志中读取数据更改的事件记录。写入中继日志:从服务器接收到这些事件后,它会将它们写入自己的中继日志(relay log)。SQL线程应用更改:从服务器上的SQL线程读取中继日志中的事件,然后在从服务器的数据库上应用它们。

专业术语:

二进制日志(Binary Log):记录了导致数据更改的所有语句的日志,主服务器上的每个写操作都会被记录在这里。中继日志(Relay Log):主服务器上的二进制日志传递到从服务器之后,从服务器上的中继日志保存了这些事件。I/O线程:这是从服务器上的线程,它连接到主服务器并从二进制日志读取事件,写入中继日志。SQL线程:又一个从服务器上的线程,它读取中继日志中的事件,并在本地数据库中执行这些SQL语句。3. 主从配置参数3.1. server_idserver_id是MySQL服务器的唯一标识符。在MySQL复制架构中,每个服务器(包括主服务器和从服务器)必须有一个唯一的server_id。在这个配置里,server_id被设置为10。这个标识符用来标识和区分不同的MySQL服务器,尤其是在多服务器(如主从复制、群集)环境中。设定server_id对于开启复制功能是必需的。样例:

server_id = 10

3.2. log_binlog_bin选项启用二进制日志功能,这是MySQL复制的基础。二进制日志记录了数据库更改的所有“事件”,如表的更改(DDL)和行的更改(DML),供其他MySQL服务器(从服务器)使用,以使数据保持同步。mysql-bin为二进制日志文件的前缀。实际的日志文件会添加上索引号,如mysql-bin.000001。开启二进制日志除了对复制有用之外,它还可以用于数据恢复操作。样例:

log_bin = mysql-bin

3.3. sync_binlogsync_binlog配置项控制着二进制日志写入磁盘的频率。设置为1意味着MySQL会在每次提交事务时都将二进制日志的事件同步写入到磁盘。这个设置可以增加MySQL操作的耐久性(Durability),因为确保了在发生崩溃时,事务的记录不会丢失。不过,这种耐久性是以性能为代价的,因为每次事务提交时的磁盘同步操作可能会引入额外的延迟。因此,这是数据安全性与性能之间的一个权衡。通过将sync_binlog设置为1,它确保了更高水平的数据安全性,尽管可能会稍微影响性能。这通常出现在需要高数据一致性和恢复能力的环境(如金融服务)中。3.4. relay_log中继日志(relay log)保存了主服务器上二进制日志的事件样例:

relay_log = /var/lib/mysql/mysql-relay-bin

3.5. log_slave_updates当设置为1时,从服务器上由于复制引起的更改也会被写入从服务器的二进制日志。这在链式复制或双向复制中是必需的。样例:

log_slave_updates = 1

3.6. read_only这个参数将从服务器设置为只读模式。这意味着只有拥有SUPER权限的用户或具有REPLICATION SLAVE权限的复制线程可以修改数据库。3.7. sync_master_info当设置为1时,每次事务提交都会同步更新主服务器信息到磁盘中。这有助于保持关于主服务器状态的信息更新,对恢复数据很重要。3.8. sync_relay_log此参数将导致从服务器在事务提交时同步中继日志到磁盘。这增加了crash-safe能力,但可能对性能有轻微影响。3.9. sync_relay_log_info与sync_relay_log相似,在事务提交时,从服务器同步中继日志信息到磁盘,这有助于确保复制的可靠性。3.10. expire_logs_days定义了mysql清除过期日志的时间3.11. max_binlog_size如果二进制日志写入的内容超出给定值,日志就会发生滚动。你不能将该变量设置为大于1GB或小于4096字节。 默认值是1GB。3.12. binlog_formatMySQL的 有三种格式,分别是:

STATEMENT优点日志文件通常较小,因为只记录了执行的SQL语句。执行SQL语句通常比ROW格式快,因为只执行一次即可影响多行。缺点可能会引起数据不一致的问题,特别是在使用存储函数、触发器、LAST_INSERT_ID()和用户自定义函数等特定SQL场景下。不支持行级的复制过滤器。因为只记录了SQL语句而没有上下文,所以在某些情况下可能难以进行故障排查。ROW优点记录了实际更改的行的数据,确保从库与主库的数据一致性,适用于所有复制类型的场景。减少了因为执行非确定性SQL语句引起的复制问题。缺点日志文件可能会很大,因为每一行更改都会被记录下来。如果频繁更新大量数据,将对磁盘空间和I/O性能造成较大压力。MIXED优点默认情况下使用STATEMENT格式,但在某些可能引起数据不一致的情况下,如有必要会自动切换至ROW格式。结合了STATEMENT和ROW两种模式的优点,旨在优化日志文件大小并保持数据一致性。缺点在某些特定情况下不容易确定MySQL是否会切换到ROW格式记录,使得预测binlog的内容和大小变得复杂。3.13. 实例配置主库配置:

[mysqld]

server-id = 10

log_bin = /var/lib/mysql/mysql-bin

sync_binlog =1

从库配置:

[mysqld]

log_bin = mysql-bin

server_id = 100

relay_log = /var/lib/mysql/mysql-relay-bin

log_slave_updates =1

read_only = 1

sync_master_info = 1

sync_relay_log = 1

sync_relay_log_info = 1

4. 主从常用命令# 开始同步

start slave;

# 查看从库状态

## 检查 SlaveIORunning 和 SlaveSQLRunning 是不是 YES

show slave status\G

# 查看 master 服务器状态,File 和 Postion 对应的值要记录下来,下面要用到

show master status;

# 查看有哪些从节点连接到主库上

show slave hosts;

# 进程

show processlist;

# binlog 事件

show binlog events;

# 查看变量

show global variables like '%server%';

show global variables like '%read_only%';

show global variables like '%log_slave_updates%';

show global variables like '%log_bin%';

5. 测试数据CREATE DATABASE `test` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

use test;

CREATE TABLE test (

id INT AUTO_INCREMENT PRIMARY KEY,

age INT,

name VARCHAR(100)

) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

INSERT INTO test (age, name) VALUES (25, 'Alice');

INSERT INTO test (age, name) VALUES (30, 'Bob');

INSERT INTO test (age, name) VALUES (22, 'Charlie');

INSERT INTO test (age, name) VALUES (22, 'li');

INSERT INTO test (age, name) VALUES (25, 'lwang');

INSERT INTO test (age, name) VALUES (23, 'zhang');

INSERT INTO test (age, name) VALUES (8, 'pali');

select * from test;

show databases;

6. 主从同步(docker)A 同步 B6.1. 准备docker pull mysql:5.7

mkdir -p /data/mysql-data/{master,slave}

# 建一个网络,以便主从容器可以相互通信:

docker network create mysql-replication-net

6.2. 主库# 启动主数据库MySQL容器:

docker run -d \

--name mysql-master \

--network mysql-replication-net \

-e MYSQL_ROOT_PASSWORD=your_master_password \

-e MYSQL_DATABASE=mydb \

-v /data/mysql-data/master:/var/lib/mysql \

mysql:5.7 \

--server-id=1 \

--log-bin=mysql-bin \

--binlog-ignore-db=mysql \

--binlog-ignore-db=sys \

--binlog-ignore-db=infomation_schema \

--binlog-ignore-db=performance_schema \

--binlog-format=ROW

创建复制帐号

# 进入容器

docker exec -it mysql-master /bin/bash

# 登陆 mysql

mysql -u root -p"$MYSQL_ROOT_PASSWORD"

# 创建复制帐号

grant replication slave,replication client on *.* to repl@'%' identified by 'your_repl_password';

FLUSH PRIVILEGES;

# 查看帐号列表

SELECT User, Host FROM mysql.user;

查看状态

# 查看 master 服务器状态,File 和 Postion 对应的值要记录下来,下面要用到

SHOW MASTER STATUS;

# 查看从节点

SHOW SLAVE HOSTS;

# 其它

SHOW VARIABLES LIKE '%server_id%';

SHOW VARIABLES LIKE '%log_bin%';

SHOW VARIABLES LIKE '%server_uuid%';

SHOW VARIABLES LIKE '%datadir%';

SHOW PROCESSLIST;

SHOW BINLOG EVENTS;

6.3. 从库# 启动从数据库MySQL容器:

# 服务器唯一id,每台服务器的id必须不同,如果配置其他从机,注意修改id

docker run -d \

--name mysql-slave \

--network mysql-replication-net \

-e MYSQL_ROOT_PASSWORD=your_slave_password \

-v /data/mysql-data/slave:/var/lib/mysql \

mysql:5.7 \

--server-id=2 \

--relay-log=relay-bin \

--log_slave_updates=1 \

--read_only=1

设置同步:

# 进入容器

docker exec -it mysql-slave /bin/bash

# 登陆 mysql

mysql -u root -p"$MYSQL_ROOT_PASSWORD"

# 执行以下SQL语句,其中MASTER_LOG_FILE和MASTER_LOG_POS需要根据上一步获得的主库状态进行替换:

CHANGE MASTER TO

MASTER_HOST='mysql-master',

MASTER_USER='repl',

MASTER_PASSWORD='your_repl_password',

MASTER_LOG_FILE='mysql-bin.000001',

MASTER_LOG_POS=1,

MASTER_CONNECT_RETRY=30;

# 开启主从同步

START SLAVE;

查看状态:

# 查看从库状态

## 检查 SlaveIORunning 和 SlaveSQLRunning 是不是 YES

show slave status\G

6.4. 停止主从同步# 在从机上执行。功能说明:停止I/O 线程和SQL线程的操作。

stop slave;

# 在从机上执行。功能说明:用于删除SLAVE数据库的relaylog日志文件,并重新启用新的relaylog文件。

reset slave;

# 在主机上执行。功能说明:删除所有的binglog日志文件,并将日志索引文件清空,重新开始所有新的日志文件。

# 用于第一次进行搭建主从库时,进行主库binlog初始化工作;

reset master;

6.5. 删除 mysqldocker rm -f mysql-master

docker rm -f mysql-slave

rm -rf /data/mysql-data/

7. 一主多从同步(docker)A 同步 BA 同步 C7.1. 准备docker pull mysql:5.7

mkdir -p /data/mysql-data/{master,slave01,slave02}

# 建一个网络,以便主从容器可以相互通信:

docker network create mysql-replication-net

7.2. 主库# 启动主数据库MySQL容器:

docker run -d \

--name mysql-master \

--network mysql-replication-net \

-e MYSQL_ROOT_PASSWORD=your_master_password \

-e MYSQL_DATABASE=mydb \

-v /data/mysql-data/master:/var/lib/mysql \

mysql:5.7 \

--server-id=1 \

--log-bin=mysql-bin \

--binlog-ignore-db=mysql \

--binlog-ignore-db=sys \

--binlog-ignore-db=infomation_schema \

--binlog-ignore-db=performance_schema \

--binlog-format=ROW

创建复制帐号

# 进入容器

docker exec -it mysql-master /bin/bash

# 登陆 mysql

mysql -u root -p"$MYSQL_ROOT_PASSWORD"

# 创建复制帐号

grant replication slave,replication client on *.* to repl@'%' identified by 'your_repl_password';

FLUSH PRIVILEGES;

# 查看帐号列表

SELECT User, Host FROM mysql.user;

查看状态

# 查看 master 服务器状态,File 和 Postion 对应的值要记录下来,下面要用到

SHOW MASTER STATUS;

# 查看有哪些从节点连接到主库上

SHOW SLAVE HOSTS;

# 其它

SHOW VARIABLES LIKE '%server_id%';

SHOW VARIABLES LIKE '%log_bin%';

SHOW VARIABLES LIKE '%server_uuid%';

SHOW VARIABLES LIKE '%datadir%';

SHOW PROCESSLIST;

SHOW BINLOG EVENTS;

7.3. 从库01# 启动从数据库MySQL容器:

# 服务器唯一id,每台服务器的id必须不同,如果配置其他从机,注意修改id

docker run -d \

--name mysql-slave01 \

--network mysql-replication-net \

-e MYSQL_ROOT_PASSWORD=your_slave_password \

-v /data/mysql-data/slave01:/var/lib/mysql \

mysql:5.7 \

--server-id=100 \

--relay-log=relay-bin \

--log_slave_updates=1 \

--read_only=1

设置同步:

# 进入容器

docker exec -it mysql-slave01 /bin/bash

# 登陆 mysql

mysql -u root -p"$MYSQL_ROOT_PASSWORD"

# 执行以下SQL语句,其中MASTER_LOG_FILE和MASTER_LOG_POS需要根据上一步获得的主库状态进行替换:

CHANGE MASTER TO

MASTER_HOST='mysql-master',

MASTER_USER='repl',

MASTER_PASSWORD='your_repl_password',

MASTER_LOG_FILE='mysql-bin.000001',

MASTER_LOG_POS=1,

MASTER_CONNECT_RETRY=30;

# 开启主从同步

START SLAVE;

查看状态:

# 查看从库状态

## 检查 SlaveIORunning 和 SlaveSQLRunning 是不是 YES

show slave status\G

7.4. 从库02# 启动从数据库MySQL容器:

# 服务器唯一id,每台服务器的id必须不同,如果配置其他从机,注意修改id

docker run -d \

--name mysql-slave02 \

--network mysql-replication-net \

-e MYSQL_ROOT_PASSWORD=your_slave_password \

-v /data/mysql-data/slave02:/var/lib/mysql \

mysql:5.7 \

--server-id=101 \

--relay-log=relay-bin \

--log_slave_updates=1 \

--read_only=1

设置同步:

# 进入容器

docker exec -it mysql-slave02 /bin/bash

# 登陆 mysql

mysql -u root -p"$MYSQL_ROOT_PASSWORD"

# 执行以下SQL语句,其中MASTER_LOG_FILE和MASTER_LOG_POS需要根据上一步获得的主库状态进行替换:

CHANGE MASTER TO

MASTER_HOST='mysql-master',

MASTER_USER='repl',

MASTER_PASSWORD='your_repl_password',

MASTER_LOG_FILE='mysql-bin.000001',

MASTER_LOG_POS=1,

MASTER_CONNECT_RETRY=30;

# 开启主从同步

START SLAVE;

查看状态:

# 查看从库状态

## 检查 SlaveIORunning 和 SlaveSQLRunning 是不是 YES

show slave status\G

7.5. 停止主从同步# 在从机上执行。功能说明:停止I/O 线程和SQL线程的操作。

stop slave;

# 在从机上执行。功能说明:用于删除SLAVE数据库的relaylog日志文件,并重新启用新的relaylog文件。

reset slave;

# 在主机上执行。功能说明:删除所有的binglog日志文件,并将日志索引文件清空,重新开始所有新的日志文件。

# 用于第一次进行搭建主从库时,进行主库binlog初始化工作;

reset master;

7.6. 删除 mysqldocker rm -f mysql-master

docker rm -f mysql-slave01

docker rm -f mysql-slave02

rm -rf /data/mysql-data/

8. 主从(主)从部署(docker)A 同步 BB 同步 C (B也即允当从库也允当主库)8.1. 准备docker pull mysql:5.7

mkdir -p /data/mysql-data/{master,master-slave01,slave02}

# 建一个网络,以便主从容器可以相互通信:

docker network create mysql-replication-net

8.2. 主库# 启动主数据库MySQL容器:

docker run -d \

--name mysql-master \

--network mysql-replication-net \

-e MYSQL_ROOT_PASSWORD=your_master_password \

-v /data/mysql-data/master:/var/lib/mysql \

mysql:5.7 \

--server-id=1 \

--log-bin=mysql-bin \

--binlog-ignore-db=mysql \

--binlog-ignore-db=sys \

--binlog-ignore-db=infomation_schema \

--binlog-ignore-db=performance_schema \

--binlog-format=ROW

创建复制帐号

# 进入容器

docker exec -it mysql-master /bin/bash

# 登陆 mysql

mysql -u root -p"$MYSQL_ROOT_PASSWORD"

# 创建复制帐号

grant replication slave,replication client on *.* to repl@'%' identified by 'your_repl_password';

FLUSH PRIVILEGES;

# 查看帐号列表

SELECT User, Host FROM mysql.user;

查看状态

# 查看 master 服务器状态,File 和 Postion 对应的值要记录下来,下面要用到

SHOW MASTER STATUS;

# 查看有哪些从节点连接到主库上

SHOW SLAVE HOSTS;

# 事件

SHOW BINLOG EVENTS;

8.3. 从库01允当slave02从库的的主库# 启动从数据库MySQL容器:

# 服务器唯一id,每台服务器的id必须不同,如果配置其他从机,注意修改id

docker run -d \

--name mysql-slave01 \

--network mysql-replication-net \

-e MYSQL_ROOT_PASSWORD=your_slave_password \

-v /data/mysql-data/slave01:/var/lib/mysql \

mysql:5.7 \

--server-id=100 \

--log-bin=mysql-slave-logbin \

--relay-log=relay-bin \

--log_slave_updates=1 \

--read_only=1

设置同步:

# 进入容器

docker exec -it mysql-slave01 /bin/bash

# 登陆 mysql

mysql -u root -p"$MYSQL_ROOT_PASSWORD"

# 执行以下SQL语句,其中MASTER_LOG_FILE和MASTER_LOG_POS需要根据上一步获得的主库状态进行替换:

CHANGE MASTER TO

MASTER_HOST='mysql-master',

MASTER_USER='repl',

MASTER_PASSWORD='your_repl_password',

MASTER_LOG_FILE='mysql-bin.000001',

MASTER_LOG_POS=1,

MASTER_CONNECT_RETRY=30;

# 开启主从同步

START SLAVE;

查看状态:

# 查看从库状态

## 检查 SlaveIORunning 和 SlaveSQLRunning 是不是 YES

show slave status\G

# 从主库的状态

show master status;

8.4. 从库02# 启动从数据库MySQL容器:

# 服务器唯一id,每台服务器的id必须不同,如果配置其他从机,注意修改id

docker run -d \

--name mysql-slave02 \

--network mysql-replication-net \

-e MYSQL_ROOT_PASSWORD=your_slave_password \

-v /data/mysql-data/slave02:/var/lib/mysql \

mysql:5.7 \

--server-id=101 \

--relay-log=relay-bin \

--log_slave_updates=1 \

--read_only=1

设置同步:

# 进入容器

docker exec -it mysql-slave02 /bin/bash

# 登陆 mysql

mysql -u root -p"$MYSQL_ROOT_PASSWORD"

# 执行以下SQL语句,其中MASTER_LOG_FILE和MASTER_LOG_POS需要根据上一步获得的主库状态进行替换:

CHANGE MASTER TO

MASTER_HOST='mysql-slave01',

MASTER_USER='repl',

MASTER_PASSWORD='your_repl_password',

MASTER_LOG_FILE='mysql-slave-logbin.000001',

MASTER_LOG_POS=1,

MASTER_CONNECT_RETRY=30;

# 开启主从同步

START SLAVE;

查看状态:

# 查看从库状态

## 检查 SlaveIORunning 和 SlaveSQLRunning 是不是 YES

show slave status\G;

8.5. 停止主从同步# 在从机上执行。功能说明:停止I/O 线程和SQL线程的操作。

stop slave;

# 在从机上执行。功能说明:用于删除SLAVE数据库的relaylog日志文件,并重新启用新的relaylog文件。

reset slave;

# 在主机上执行。功能说明:删除所有的binglog日志文件,并将日志索引文件清空,重新开始所有新的日志文件。

# 用于第一次进行搭建主从库时,进行主库binlog初始化工作;

reset master;

8.6. 删除 mysqldocker rm -f mysql-master

docker rm -f mysql-slave01

docker rm -f mysql-slave02

rm -rf /data/mysql-data/

9. 主从同步(docker-compose)A 同步 B9.1. 准备docker pull mysql:5.7

mkdir -p /data/mysql-data/{master,slave}

mkdir -p /data/mysql-compose/

mkdir -p /data/mysql-config/

9.2. 配置

# 创建 master config

cat > /data/mysql-config/master.cnf <

[mysqld]

server_id = 1

log_bin = mysql-bin

sync_binlog = 1

binlog_format=ROW

# 清理策略

expire_logs_days=7

max_binlog_size = 500M

# 不需要写binlog的库

binlog_ignore_db = mysql

binlog_ignore_db = information_schema

binlog_ignore_db = performance_schema

binlog_ignore_db = sys

# 从库不进行同步的库

replicate_ignore_db = mysql

replicate_ignore_db = information_schema

replicate_ignore_db = performance_schema

replicate_ignore_db = sys

EOF

# 创建 slave config

cat > /data/mysql-config/slave.cnf <

[mysqld]

server_id = 100

relay_log = /var/lib/mysql/mysql-relay-bin

log_slave_updates =1

read_only = 1

sync_master_info = 1

sync_relay_log = 1

sync_relay_log_info = 1

EOF

9.3. 创建 docker-composecat > /data/mysql-compose/master-slave.yaml <

version: '3.1'

services:

# 主库

mysql-master:

container_name: mysql-master

image: mysql:5.7

restart: always

environment:

MYSQL_ROOT_PASSWORD: your_master_password

MYSQL_DATABASE: mydb

ports:

- "3306:3306"

volumes:

- /data/mysql-data/master:/var/lib/mysql

- /data/mysql-config/master.cnf:/etc/mysql/conf.d/master.cnf

networks:

- mysql-master-slave-net

# 从库

mysql-slave:

image: mysql:5.7

container_name: mysql-slave

restart: always

environment:

MYSQL_ROOT_PASSWORD: your_slave_password

volumes:

- /data/mysql-data/slave:/var/lib/mysql

- /data/mysql-config/slave.cnf:/etc/mysql/conf.d/slave.cnf

networks:

- mysql-master-slave-net

networks:

mysql-master-slave-net:

driver: bridge

EOF

9.4. 启动服务# 启动服务

docker-compose -f /data/mysql-compose/master-slave.yaml up -d

# 创建复制帐号

# 进入容器

docker exec -it mysql-master /bin/bash

# 登陆 mysql

mysql -u root -p"$MYSQL_ROOT_PASSWORD"

# 创建复制帐号

grant replication slave,replication client on *.* to repl@'%' identified by 'your_repl_password';

FLUSH PRIVILEGES;

# 查看帐号列表

SELECT User, Host FROM mysql.user;

查看状态

# 查看 master 服务器状态,File 和 Postion 对应的值要记录下来,下面要用到

SHOW MASTER STATUS;

# 查看从节点

SHOW SLAVE HOSTS;

9.5. 设置主从同步# 进入容器

docker exec -it mysql-slave /bin/bash

# 登陆 mysql

mysql -u root -p"$MYSQL_ROOT_PASSWORD"

# 执行以下SQL语句,其中MASTER_LOG_FILE和MASTER_LOG_POS需要根据上一步获得的主库状态进行替换:

CHANGE MASTER TO

MASTER_HOST='mysql-master',

MASTER_USER='repl',

MASTER_PASSWORD='your_repl_password',

MASTER_LOG_FILE='mysql-bin.000001',

MASTER_LOG_POS=1,

MASTER_CONNECT_RETRY=30;

# 开启主从同步

START SLAVE;

查看状态:

# 查看从库状态

## 检查 SlaveIORunning 和 SlaveSQLRunning 是不是 YES

show slave status\G

9.6. 停止主从同步# 在从机上执行。功能说明:停止I/O 线程和SQL线程的操作。

stop slave;

# 在从机上执行。功能说明:用于删除SLAVE数据库的relaylog日志文件,并重新启用新的relaylog文件。

reset slave;

# 在主机上执行。功能说明:删除所有的binglog日志文件,并将日志索引文件清空,重新开始所有新的日志文件。

# 用于第一次进行搭建主从库时,进行主库binlog初始化工作;

reset master;

9.7. 重启服务# 重启

docker-compose -f /data/mysql-compose/master-slave.yaml restart

docker-compose -f /data/mysql-compose/master-slave.yaml up -d --force-recreate

9.8. 删除 mysqldocker-compose -f /data/mysql-compose/master-slave.yaml down -v

rm -rf /data/mysql-data/

mkdir -p /data/mysql-data/{master,slave}

10. 主从同步(docker-compose自动)A 同步 B10.1. 准备docker pull mysql:5.7

mkdir -p /data/mysql-data/{master,slave}

mkdir -p /data/mysql-compose/

mkdir -p /data/mysql-config/

mkdir -p /data/mysql-script/

10.2. 配置

# 创建 master config

cat > /data/mysql-config/master.cnf <

[mysqld]

server_id = 1

log_bin = mysql-bin

sync_binlog = 1

binlog_format=ROW

# 清理策略

expire_logs_days=7

max_binlog_size = 500M

# 不需要写binlog的库

binlog_ignore_db = mysql

binlog_ignore_db = information_schema

binlog_ignore_db = performance_schema

binlog_ignore_db = sys

# 从库不进行同步的库

replicate_ignore_db = mysql

replicate_ignore_db = information_schema

replicate_ignore_db = performance_schema

replicate_ignore_db = sys

EOF

# 创建 slave config

cat > /data/mysql-config/slave.cnf <

[mysqld]

server_id = 100

relay_log = /var/lib/mysql/mysql-relay-bin

log_slave_updates =1

read_only = 1

sync_master_info = 1

sync_relay_log = 1

sync_relay_log_info = 1

EOF

10.3. 自动脚本# 主库

cat <

# 创建复制帐号

# grant replication slave,replication client on *.* to repl@'%' identified by 'your_repl_password';

CREATE USER 'repl'@'%' IDENTIFIED BY 'your_repl_password';

GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';

FLUSH PRIVILEGES;

EOF

# 从库

cat <

CHANGE MASTER TO

MASTER_HOST='mysql-master',

MASTER_USER='repl',

MASTER_PASSWORD='your_repl_password',

MASTER_LOG_FILE='mysql-bin.000001',

MASTER_LOG_POS=1,

MASTER_CONNECT_RETRY=30;

START SLAVE;

EOF

# 查看

10.4. 创建 docker-composecat <

version: '3.1'

services:

# 主库

mysql-master:

container_name: mysql-master

image: mysql:5.7

restart: always

environment:

MYSQL_ROOT_PASSWORD: your_master_password

MYSQL_DATABASE: mydb

ports:

- "3306:3306"

volumes:

- /data/mysql-data/master:/var/lib/mysql

- /data/mysql-config/master.cnf:/etc/mysql/conf.d/master.cnf

- /data/mysql-script/master.sql:/docker-entrypoint-initdb.d/master.sql

networks:

- mysql-master-slave-net

# 从库

mysql-slave:

image: mysql:5.7

container_name: mysql-slave

restart: always

environment:

MYSQL_ROOT_PASSWORD: your_slave_password

volumes:

- /data/mysql-data/slave:/var/lib/mysql

- /data/mysql-config/slave.cnf:/etc/mysql/conf.d/slave.cnf

- /data/mysql-script/slave.sql:/docker-entrypoint-initdb.d/slave.sql

networks:

- mysql-master-slave-net

networks:

mysql-master-slave-net:

driver: bridge

EOF

10.5. 启动服务# 启动服务

docker-compose -f /data/mysql-compose/master-slave.yaml up -d

10.6. 查看主库状态

# 进入容器

docker exec -it mysql-master /bin/bash

# 登陆 mysql

mysql -u root -p"$MYSQL_ROOT_PASSWORD"

# 查看帐号列表,检查是否有 repl 帐号

SELECT User, Host FROM mysql.user;

# 查看 master 服务器状态

SHOW MASTER STATUS;

# 查看从节点

SHOW SLAVE HOSTS;

10.7. 查看从库状态# 进入容器

docker exec -it mysql-slave /bin/bash

# 登陆 mysql

mysql -u root -p"$MYSQL_ROOT_PASSWORD"

## 检查 SlaveIORunning 和 SlaveSQLRunning 是不是 YES

show slave status\G

10.8. 停止主从同步# 在从机上执行。功能说明:停止I/O 线程和SQL线程的操作。

stop slave;

# 在从机上执行。功能说明:用于删除SLAVE数据库的relaylog日志文件,并重新启用新的relaylog文件。

reset slave;

# 在主机上执行。功能说明:删除所有的binglog日志文件,并将日志索引文件清空,重新开始所有新的日志文件。

# 用于第一次进行搭建主从库时,进行主库binlog初始化工作;

reset master;

10.9. 重启服务# 重启

docker-compose -f /data/mysql-compose/master-slave.yaml restart

docker-compose -f /data/mysql-compose/master-slave.yaml up -d --force-recreate

10.10. 删除 mysqldocker-compose -f /data/mysql-compose/master-slave.yaml down -v

rm -rf /data/mysql-data/

mkdir -p /data/mysql-data/{master,slave}

11. mysqldump 导出--master-data该参数用于将主库的bin-log信息写入到dump文件中,即当前文件名(filename)和位置(position),用于主从复制的搭建### 5.1. 加锁导出

## 12. 使用--master-data参数的默认行为是先给所有的表加读锁,然后记录其二进制日志位置,并最终写入到转储文件中,执行完后会自动解锁。

mysqldump --all-databases --master-data > dbdump.db

# 会将change master 语句写入dump文件中

# 在从库导入后,配置主从无需再指定文件名和位置

mysqldump --master-data -uroot -p"$MYSQL_ROOT_PASSWORD" test > dbdump-test.db

# 会将change master 语句写入dump文件中,只不过会被注释掉

# 在从库导入后,配置主从需要指定文件名和位置

mysqldump --master-data=1 -uroot -p"$MYSQL_ROOT_PASSWORD" test > dbdump-test.db

12. 参考https://www.cnblogs.com/jhxxb/p/14987112.htmlhttps://www.didispace.com/installation-guide/middleware/mysql-cluster-2.htmlhttps://dev.mysql.com/doc/refman/5.7/en/replication-configuration.htmlhttps://learnku.com/articles/30439https://developer.aliyun.com/article/681817« PreviousMysql Xtrabackup 极简教程Next »MySQL 操作手册