搭建mysql主从服务器
Ubantu/Linux
环境要求:
- Docker
- MySQL
搭建步骤
1、docker 拉取 mysql 镜像
# 查看系统 MySQL 版本,也通过进入 mysql 来查看
mysql -V 或 mysql -uroot -p
# 拉取相同版本的 mysql 镜像。不同版本的 mysql 可能无法建立主从联系
sudo docker pull mysql:5.7.34
2、主机配置
-
以系统 mysql 作为主机,修改主机配置文件
# 文件位置:/etc/mysql/mysql.conf.d/mysqld.cnf # 开启日志 general_log_file = /var/log/mysql/mysql.log general_log = 1 # 服务id server-id = 1 # 开启从机访问接口:二进制日志 log_bin = /var/log/mysql/mysql-bin.log
-
重启主机,查看主机状态
# 重启 mysql 主机。停止和启动分别对应 stop/start sudo service mysql restart # 进入 mysql mysql -uroot -p # 查看主机状态。会显示 File 和 Position,请记住,这需要在从机中设置。 show master status;
-
创建从机用户
# 创建从机用户。 GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' identified by 'slave'; # 刷新权限 REPLICATION SLAVE;
tips:
REPLICATION SLAVE 权限是全局性的,必须作用于所有数据库: *.*
可以在主机配置文件中限制从机能访问的数据库:
# 允许从机访问:二进制日志要记录数据库 binlog_do_db = include_database_name # 不允许从机访问:二进制日志要忽略的数据库 binlog_ignore_db = include_database_name
3、从机配置
-
创建从机配置文件
# 创建从机目录 mkdir slave_mysql/ cd slave_mysql/ mkdir data mkdir mysql.conf.d # 复制主机配置文件:/etc/mysql/mysql.conf.d/mysqld.cnf cp /etc/mysql/mysql.conf.d/mysqld.cnf mysql.conf.d/ # 修改配置文件 # 修改端口号 port = 3307 # 关闭日志 #general_log_file = /var/log/mysql/mysql.log general_log = 0 # 服务id server-id = 2 # 关闭二进制日志 # log_bin = /var/log/mysql/mysql-bin.log
-
启动 docker mysql 从机
# MYSQL_ROOT_PASSWORD 为 root 密码,需牢记。 sudo docker run --name mysql-slave -e MYSQL_ROOT_PASSWORD=mysql -d --network=host -v ~/slave_mysql/data:/var/lib/mysql -v ~/slave_mysql/mysql.conf.d:/etc/mysql/mysql.conf.d mysql:5.7.34
如果从机无法启动,请删除容器、slave_mysql/data文件下所有文件,重新尝试。
sudo docker rm -f mysql-slave rm -rf ~/slave_mysql/data/*
-
进入从机,连接主机,查看状态。
# 进入从机 mysql -uroot -pmysql -h 127.0.0.1 --port=3307 # 连接主机 change master to master_host='127.0.0.1', master_user='slave',master_password='slave',master_log_file='mysql-bin.000009',master_log_pos=1562; # master_host 主机ip, master_user 主机用户指定为刚创建的从机用户, # master_log_file 和 master_log_pos 分别是主机状态中的 File 和 Position # 开启从机 start slave # 查看从机状态 show slave status \G; # 以下两项状态如下,则连接成功。 # Slave_IO_Running: Yes # Slave_SQL_Running: Yes
如果连接失败,请删除容器、从机目录后,重新尝试。