赞
踩
网上部署mysql的教程很多,但是关于最新版mysql8.4.0的资料还是比较少的。所以我就做了这篇教程,提升一下熟练度,也供大家参考一下。这篇教程非常适合手残党,只要跟着步骤走,复制即可实现。
开发软件:VMware+FinalShell
主服务器3306端口
sudo docker run -d --name mysql-master -e MYSQL_ROOT_PASSWORD=123456 -v /opt/mysql_data_master:/var/lib/mysql -v /opt/mysql_conf_master:/etc/mysql/conf.d -p 3306:3306 mysql:8.4.0
从服务器3307端口
sudo docker run -d --name mysql-slave -e MYSQL_ROOT_PASSWORD=123456 -v /opt/mysql_data_slave:/var/lib/mysql -v /opt/mysql_conf_slave:/etc/mysql/conf.d -p 3307:3306 mysql:8.4.0
关闭防火墙(一定要执行,防止Replica_IO_Running为No的现象)
- #关闭防火墙
- systemctl stop firewalld
-
- #查看防火墙状态
- systemctl status firewalld
-
执行效果:
参数说明:
-p 3306:3306: 这个选项将容器的3306端口映射到主机的3306端口。这样,你可以通过主机的3306端口访问MySQL容器
-v /opt/mysql_data_master:/var/lib/mysql: 这个选项指定了一个数据卷的映射。将主机的/opt/mysql_data_master目录映射到容器的/var/lib/mysql目录,这样MySQL的数据文件将会存储在主机上,以便持久化保存。
-v /opt/mysql_conf_master:/etc/mysql/conf.d: 这个选项指定了另一个数据卷的映射。将主机的/opt/mysql_conf_master目录映射到容器的/etc/mysql/conf.d目录,这样你可以在主机上配置MySQL的配置文件。
注:此处引自参考资料第一条
检查mysql容器是否创建成功
docker ps
由于启动容器的时候做了做了数据和配置的挂载,因此只需在本地/opt/mysql_conf_master修改配置即可映射到容器内部
a.用文本编辑器进行配置
- #切换到本地主库配置目录
- cd /opt/mysql_conf_master
-
- #创建并修改配置文件
- vim my.cnf
-
- #输入i,进入插入模式
- #建议在第三至第四行将下列配置复制进去
- #建议后期再删除不需要的配置
- #主库配置
-
-
- [mysql]
- #设置mysql客户端默认字符集
- default-character-set=UTF8MB4
- [mysqld]
- sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
- init_connect='SET collation_connection = utf8_unicode_ci'
- init_connect='SET NAMES utf8'
- #设置3306端口
- port=3306
- #允许最大连接数
- max_connections=200
- #允许连接失败的次数
- max_connect_errors=10
-
- #服务端使用的字符集默认为8比特编码的latin1字符集
- character-set-server=UTF8MB4
- #开启查询缓存
- explicit_defaults_for_timestamp=true
- #创建新表时将使用的默认存储引擎
- default-storage-engine=INNODB
- #等待超时时间秒
- wait_timeout=60
- #交互式连接超时时间秒
- interactive-timeout=600
- #使用mysql_native_password验证密码
- mysql_native_password=on
-
- #主服务器唯一ID
- server-id=4
- #启用二进制日志
- log-bin=mysql-bin
- #设置不要复制的数据库(可设置多个)
- binlog-ignore-db=mysql
- binlog-ignore-db=information_schema
- #设置需要复制的数据库需要复制的主数据库名字
- binlog-do-db=myDatabase
-
-
-
- [mysqld_safe]
- log-error=/var/log/mysql/mysql.log
- pid-file=/var/run/mysql/mysql.pid
-
-
-
-
-
-
- #粘贴完毕后,按左上角esc 输入:wq 按enter键保存
-
-
-
-
-
- #切换到本地从库配置目录
- cd /opt/mysql_conf_slave
- #创建并修改配置文件
- vim my.cnf
-
-
- #输入i,进入插入模式
- #建议在第三至第四行将下列配置复制进去
- #建议后期再删除不需要的配置
-
-
- #从库配置
-
-
-
- [mysql]
- #设置mysql客户端默认字符集
- default-character-set=UTF8MB4
- [mysqld]
- sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
- init_connect='SET collation_connection = utf8_unicode_ci'
- init_connect='SET NAMES utf8'
- #设置3306端口
- port=3306
- #允许最大连接数
- max_connections=200
- #允许连接失败的次数
- max_connect_errors=10
-
- #服务端使用的字符集默认为8比特编码的latin1字符集
- character-set-server=UTF8MB4
- #开启查询缓存
- explicit_defaults_for_timestamp=true
- #创建新表时将使用的默认存储引擎
- default-storage-engine=INNODB
- #等待超时时间秒
- wait_timeout=60
- #交互式连接超时时间秒
- interactive-timeout=600
- #使用mysql_native_password验证密码
- mysql_native_password=on
-
- #从服务器唯一ID
- server-id=44
- #启用中继日志
- relay-log=mysql-relay
- #使得更新的数据写进二进制日志中
- log-slave-updates=1
-
-
-
- #需要主从复制的数据库 ,如多个则重复配置
- replicate-do-db=myDatabase
- #复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步) ,如多个则重复配置
- binlog-ignore-db=mysql
- #为每个session分配的内存,在事务过程中用来存储二进制日志的缓存
- binlog_cache_size=1M
- #主从复制的格式(mixed,statement,row,默认格式是statement。建议是设置为row,主从复制时数据更加能够统一)
- binlog_format=row
- #配置二进制日志自动删除/过期时间,单位秒,默认值为2592000,即30天;8.0.3版本之前使用expire_logs_days,单位天数,默认值为0,表示不自动删除。
- binlog_expire_logs_seconds=2592000
- #跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断,默认OFF关闭,可选值有OFF、all、ddl_exist_errors以及错误码列表。8.0.26版本之前使用slave_skip_errors
- #如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
- slave_skip_errors=1062
- #relay_log配置中继日志,默认采用 主机名-relay-bin 的方式保存日志文件
- relay_log=replicas-mysql-relay-bin
- log_slave_updates=ON
- #防止改变数据(只读操作,除了特殊的线程)
- read_only=ON
-
-
- [mysqld_safe]
- log-error=/var/log/mysql/mysql.log
- pid-file=/var/run/mysql/mysql.pid
-
-
-
-
- #粘贴完毕后,按左上角esc 输入:wq 按enter键保存
-
-
-

b.用FinalShell进行配置
- /opt/mysql_conf_master
-
- /opt/mysql_conf_slave
右击新建文件,图中多了一个字
双击文件,图中多了一个字
将下列配置粘贴进去并保存
- #主库配置
-
-
- [mysql]
- #设置mysql客户端默认字符集
- default-character-set=UTF8MB4
- [mysqld]
- sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
- init_connect='SET collation_connection = utf8_unicode_ci'
- init_connect='SET NAMES utf8'
- #设置3306端口
- port=3306
- #允许最大连接数
- max_connections=200
- #允许连接失败的次数
- max_connect_errors=10
-
- #服务端使用的字符集默认为8比特编码的latin1字符集
- character-set-server=UTF8MB4
- #开启查询缓存
- explicit_defaults_for_timestamp=true
- #创建新表时将使用的默认存储引擎
- default-storage-engine=INNODB
- #等待超时时间秒
- wait_timeout=60
- #交互式连接超时时间秒
- interactive-timeout=600
- #使用mysql_native_password验证密码
- mysql_native_password=ON
-
- #主服务器唯一ID
- server-id=4
- #启用二进制日志
- log-bin=mysql-bin
- #设置不要复制的数据库(可设置多个)
- binlog-ignore-db=mysql
- binlog-ignore-db=information_schema
- #设置需要复制的数据库需要复制的主数据库名字
- binlog-do-db=myDatabase
-
-
-
- [mysqld_safe]
- log-error=/var/log/mysql/mysql.log
- pid-file=/var/run/mysql/mysql.pid
-
-

同样的,在/opt/mysql_conf_slave文件下新建my.cnf文件,粘贴下列配置并保存
- #从库配置
-
-
-
- [mysql]
- #设置mysql客户端默认字符集
- default-character-set=UTF8MB4
- [mysqld]
- sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
- init_connect='SET collation_connection = utf8_unicode_ci'
- init_connect='SET NAMES utf8'
- #设置3306端口
- port=3306
- #允许最大连接数
- max_connections=200
- #允许连接失败的次数
- max_connect_errors=10
-
- #服务端使用的字符集默认为8比特编码的latin1字符集
- character-set-server=UTF8MB4
- #开启查询缓存
- explicit_defaults_for_timestamp=true
- #创建新表时将使用的默认存储引擎
- default-storage-engine=INNODB
- #等待超时时间秒
- wait_timeout=60
- #交互式连接超时时间秒
- interactive-timeout=600
- #使用mysql_native_password验证密码
- mysql_native_password=ON
-
- #从服务器唯一ID
- server-id=44
- #启用中继日志
- relay-log=mysql-relay
- #使得更新的数据写进二进制日志中
- log-slave-updates=1
-
-
-
- #需要主从复制的数据库 ,如多个则重复配置
- replicate-do-db=myDatabase
- #复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步) ,如多个则重复配置
- binlog-ignore-db=mysql
- #为每个session分配的内存,在事务过程中用来存储二进制日志的缓存
- binlog_cache_size=1M
- #主从复制的格式(mixed,statement,row,默认格式是statement。建议是设置为row,主从复制时数据更加能够统一)
- binlog_format=row
- #配置二进制日志自动删除/过期时间,单位秒,默认值为2592000,即30天;8.0.3版本之前使用expire_logs_days,单位天数,默认值为0,表示不自动删除。
- binlog_expire_logs_seconds=2592000
- #跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断,默认OFF关闭,可选值有OFF、all、ddl_exist_errors以及错误码列表。8.0.26版本之前使用slave_skip_errors
- #如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
- slave_skip_errors=1062
- #relay_log配置中继日志,默认采用 主机名-relay-bin 的方式保存日志文件
- relay_log=replicas-mysql-relay-bin
- log_slave_updates=ON
- #防止改变数据(只读操作,除了特殊的线程)
- read_only=ON
-
-
- [mysqld_safe]
- log-error=/var/log/mysql/mysql.log
- pid-file=/var/run/mysql/mysql.pid
-
-
-

注:此处引自参考资料第二条
修改完主从服务器之后一定要重启,重启才能生效
- docker restart mysql-master;
- docker restart mysql-slave;
根据容器名进入容器内部
docker exec -it mysql-master bash #mysql-master是mysql容器的名字。
用root账号登录mysql
mysql -uroot -p123456 #用户名和密码在创建容器的时候就设置了 root 123456
切换数据库并创建用户及授权
- #切换mysql数据库
- use mysql;
-
- #创建用户slave并授权,slave为用户名,通配符%表示任意ip,密码为123456
- create user 'slave'@'%' identified with mysql_native_password by '123456';
-
- #给slave用户授权
- grant replication slave on *.* to 'slave'@'%';
-
-
- #刷新权限
- flush privileges;
-
-
- #查询主服务器状态,并记录File和Position的值
- show binary log status;
-
- #注意:执行完此步骤后退出主数据库,防止再次操作导致File和Position的值发生变化
- exit;
- #退出mysql-master容器
- exit

注:此处引自参考资料第二条
执行结果:
- #进入从服务器容器
- docker exec -it mysql-slave bash
-
- #登录从服务器
- mysql -uroot -p123456
-
- #如若之前同步过可执行改行代码
- STOP REPLICA;
- RESET REPLICA;
-
- #设置要复制数据的主服务器
- CHANGE REPLICATION SOURCE TO SOURCE_HOST='192.168.200.128', #主服务器ip
- SOURCE_PORT=3306, #主服务器端口号
- SOURCE_USER='slave', #主服务器授权复制的用户
- SOURCE_PASSWORD='123456', #授权用户的密码
- SOURCE_LOG_FILE='mysql-bin.000001', #之前记录的file值
- SOURCE_LOG_POS=158; #之前记录的position值
-
- #开始复制主服务器数据
- START REPLICA;
-
- #查看从库复制情况
- SHOW REPLICA STATUS\G;

执行效果:
关键属性:
当这些关键属性与图中一致时即可
主库中配置的: #设置需要复制的数据库需要复制的主数据库名字binlog-do-db=myDatabase
从库中配置的: replicate-do-db=myDatabase #设置需要复制的数据库需要复制的主数据库名字
建库:
建表:
插入数据:
到此就成功了!
记得执行前的网络设置一定是要能ping通的,如果网络问题可以再查查资料。
如有不正确的地方,希望大家多多多包涵,在评论区指出,这样就可以避免错误,谢谢大家!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。