概要
linux下使用docker安装mysql服务,并配置mysql主从数据实时同步
实现步骤
- 一、主库安装
- docker下载最新版mysql镜像包(未安装docker,则自行百度搜索linux安装docker教程)
docker pull mysql
- 查看下载好的镜像
docker images
- docker运行mysql服务,作为主机mysql服务,服务名是mysql
docker run -p 3306:3306 --name mysql --restart=always --privileged=true \ -v /usr/local/mysql/log:/var/log/mysql \ -v /usr/local/mysql/data:/var/lib/mysql \ -v /usr/local/mysql/conf:/etc/mysql \ -v /etc/localtime:/etc/localtime:ro \ -e MYSQL_ROOT_PASSWORD=root -d mysql:latest
-p 3306:3306:指定宿主机端口与容器端口映射关系
--name mysql:创建的容器名称
--restart=always:总是跟随docker启动
--privileged=true:获取宿主机root权限
-v /usr/local/mysql/log:/var/log/mysql:映射日志目录,宿主机:容器
-v /usr/local/mysql/data:/var/lib/mysql:映射数据目录,宿主机:容器
-v /usr/local/mysql/conf:/etc/mysql:映射配置目录,宿主机:容器
-v /etc/localtime:/etc/localtime:ro:让容器的时钟与宿主机时钟同步,ro表示只读。
-e MYSQL_ROOT_PASSWORD=root:指定mysql环境变量,root用户初始密码是root
-d mysql:latest:后台运行mysql容器,版本是latest -
进入mysql的conf配置文件目录,并创建my.cnf文件
cd /usr/local/mysql/conf && vi my.cnf
在my.cnf文件中填入下面的内容后保存:
[client] default-character-set=utf8mb4 [mysql] default-character-set=utf8mb4 [mysqld] # 设置东八区时区 default-time_zone = '+8:00' #设置密码验证规则 authentication_policy=mysql_native_password # 限制导入和导出的数据目录 # 为空,不限制导入到处的数据目录; secure_file_priv= init_connect='SET collation_connection = utf8mb4_general_ci' init_connect='SET NAMES utf8mb4' character-set-server=utf8mb4 collation-server=utf8mb4_general_ci skip-character-set-client-handshake skip-name-resolve # 开启logbin log_bin=binlog # binlog日志格式 binlog_format=ROW # mysql主从备份serverId server_id=12345 #配置数据库表名小写 lower_case_table_names=1
- 重启mysql服务,时my.cnf生效
docker restart mysql
- 进入容器内部创建并授权用户
#进入容器内部 docker exec -it mysql /bin/bash #登录mysql,不要输入密码,两次按两次回车键即可 mysql -u root -p #查看数据库 show databases; #切换到mysql库 use mysql; #创建root和master用户 create USER 'root'@'%' IDENTIFIED BY 'root'; grant all on *.* to 'root'@'%'; create USER 'master'@'%' IDENTIFIED BY 'root'; grant all on *.* to 'master'@'%'; FLUSH PRIVILEGES; #使用exit命令退出mysql exit; #使用exit命令退出mysql容器 exit;
至此mysql主库安装并配置完成
-
二、从库安装
- docker运行mysql服务,作为从机mysql服务,服务名是mysq_slave
-p 4306:3306:指定宿主机端口与容器端口映射关系 --name mysql_slave:创建的容器名称 --restart=always:总是跟随docker启动 --privileged=true:获取宿主机root权限 -v /usr/local/mysql_slave/log:/var/log/mysql:映射日志目录,宿主机:容器 -v /usr/local/mysql_slave/data:/var/lib/mysql:映射数据目录,宿主机:容器 -v /usr/local/mysql_slave/conf:/etc/mysql:映射配置目录,宿主机:容器 -v /etc/localtime:/etc/localtime:ro:让容器的时钟与宿主机时钟同步,ro表示只读。 -e MYSQL_ROOT_PASSWORD=root:指定mysql环境变量,root用户初始密码是root -d mysql:latest:后台运行mysql容器,版本是latest
-p 4306:3306:指定宿主机端口与容器端口映射关系(从机对外暴露端口是4306)
-
进入mysql的conf配置文件目录,并创建my.cnf文件
cd /usr/local/mysql_slave/conf && vi my.cnf
在my.cnf文件中填入下面的内容后保存:
[client] default-character-set=utf8mb4 [mysql] default-character-set=utf8mb4 [mysqld] # 设置东八区时区 default-time_zone = '+8:00' #设置密码验证规则 authentication_policy=mysql_native_password # 限制导入和导出的数据目录 # 为空,不限制导入到处的数据目录; secure_file_priv= init_connect='SET collation_connection = utf8mb4_general_ci' init_connect='SET NAMES utf8mb4' character-set-server=utf8mb4 collation-server=utf8mb4_general_ci skip-character-set-client-handshake skip-name-resolve #server_id不要和主库的server_id相同就行 server_id=22345 #一般从数据库作为读数据库 default-storage-engine=MyISAM #配置数据库表名小写 lower_case_table_names=1
- 重启mysql服务,时my.cnf生效
docker restart mysql_slave
- 进入容器内部创建并授权用户
#进入容器内部 docker exec -it mysql_slave /bin/bash #登录mysql,不要输入密码,两次按两次回车键即可 mysql -u root -p #查看数据库 show databases; #切换到mysql库 use mysql; #创建root和slave用户 create USER 'root'@'%' IDENTIFIED BY 'root'; grant all on *.* to 'root'@'%'; create USER 'slave'@'%' IDENTIFIED BY 'root'; grant all on *.* to 'slave'@'%'; FLUSH PRIVILEGES; #使用exit命令退出mysql exit; #使用exit命令退出mysql容器 exit;
至此mysql从库安装并配置完成
-
三、配置数据同步
- 使用root账号/密码(root/root)远程连接主库,并查看主库binlog日志状态
show master status;如下图所示,标识主库已开启binlog日志 - 使用root账号/密码(root/root)远程连接从库,并执行下面sql:
#停止slave
stop slave;
#同步数据配置
CHANGE MASTER TO MASTER_HOST = '192.168.7.46', #主库host
MASTER_PORT = 3306,#主库端口
MASTER_USER = 'master',#主库用于binlog同步的账户
MASTER_PASSWORD = 'root',#主库用于binlog同步的账户密码
MASTER_LOG_FILE = 'binlog.000005',#主库binlog文件,第1步执行结果中获取
MASTER_LOG_POS = 5847;#主库binlog文件位置,第1步执行结果中获取 - 在从库数据库中,启动slave同步进程
start slave;#启动 - 登录从库,查看同步配置
#进入从机容器内部 docker exec -it mysql_slave /bin/bash #登录mysql,不要输入密码,两次回车即可 mysql -u root -p #查看binlog同步配置及状态 show slave status\G;
如上图所属,表示同步已启动并正在运行中
-
四、测试数据主从同步
- 在主库新建数据库test,然后创建表test,再给test表新增数据,然后登录或刷新从库,查看表及数据
主库数据情况如下图:
从库数据情况如下图: - 从上面两个图对比,发现主库数据变化后,刷新从库,即可看到从库数据也及时同步过来了。
小结
mysql主从配置,重点在从库的配置,如果从库出现异常,导致无法正常同步了,则执行下面sql进行恢复
#停止slave
stop slave;
#同步数据配置
CHANGE MASTER TO MASTER_HOST = '192.168.7.46', #主库host
MASTER_PORT = 3306,#主库端口
MASTER_USER = 'master',#主库用于binlog同步的账户
MASTER_PASSWORD = 'root',#主库用于binlog同步的账户密码
MASTER_LOG_FILE = '此处的值需要在主库通过show master status获取',
MASTER_LOG_POS = 此处的值需要在主库通过show master status获取;