1.拉取MySQL(最新版本)镜像到本地
docker pull mysql # 如果你只需要跑一个mysql实例,不做主从,那么执行以下命令即可,不用再做后面的参考步骤:
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:latest #然后用shell或客户端软件通过配置( 用户名:root 密码:132456 IP:你的本机ip 端口:3306)来登录即可
2. 准备MySQL配置文件
mysql安装后的默认配置文件在/etc/mysql/my.cnf
, 而自定义的配置文件一般放在/etc/mysql/conf.d
这个路径下。
现在我们在本地host主机上自定义的某个目录(如/data/mysql/conf/
),先创建两个文件master.conf和slave.conf,分别用于配置主从两个节点。
- /data/mysql/conf/master.conf
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
log_bin = log #开启二进制日志,用于从节点的历史复制回放
collation-server = utf8_unicode_ci
init-connect='SET NAMES utf8'
character-set-server = utf8
server_id = 1 #需保证主库和从库的server_id不同, 假设主库设为1
replicate-do-db=icloud #需要复制的数据库名,需复制多个数据库的话则重复设置这个选项
- /data/mysql/conf/slave.conf
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
log_bin = log #开启二进制日志,用于从节点的历史复制回放
collation-server = utf8_unicode_ci
init-connect='SET NAMES utf8'
character-set-server = utf8
server_id = 2 #需保证主库和从库的server_id不同, 假设从库设为2
replicate-do-db=icloud #需要复制的数据库名,需复制多个数据库的话则重复设置这个选项
3. Docker分别运行MySQL主/从两个容器
- 将mysql主节点运行起来
sudo mkdir -p /data/mysql/datam
sudo docker run -d --name mysql-master -p 13306:3306 -v /data/mysql/conf/master.conf:/etc/mysql/mysql.conf.d/mysqld.cnf -v /data/mysql/datam:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:latest
运行参数说明:
--name mysql-master: 容器的名称设为mysql-master
-p 13306:3306: 将host的13306端口映射到容器的3306端口
-v /data/mysql/conf/master.conf:/etc/mysql/mysql.conf.d/mysqld.cnf : master.conf配置文件挂载
-v /data/mysql/datam:/var/lib/mysql : mysql容器内数据挂载到host的/data/mysql/datam, 用于持久化
-e MYSQL_ROOT_PASSWORD=123456 : mysql的root登录密码为123456
- 将mysql从节点运行起来
sudo mkdir -p /data/mysql/datas
sudo docker run -d --name mysql-slave -p 13307:3306 -v /data/mysql/conf/slave.conf:/etc/mysql/mysql.conf.d/mysqld.cnf -v /data/mysql/datas:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:latest
运行参数说明:
--name mysql-slave: 容器的名称设为mysql-slave
-p 13307:3306: 将host的13307端口映射到容器的3306端口
-v /data/mysql/conf/slave.conf:/etc/mysql/mysql.conf.d/mysqld.cnf : slave.conf配置文件挂载
-v /data/mysql/datas:/var/lib/mysql : mysql容器内数据挂载到host的/data/mysql/datas, 用于持久化
-e MYSQL_ROOT_PASSWORD=123456 : mysql的root登录密码为123456
4.登录MySQL主节点配置同步信息#
- 登录mysql
mysql -u root -h 192.168.1.xx -P13306 -p123456 # 192.168.1.xx 是你本机的内网ip
- 在mysql client中执行
mysql> CREATE USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%';
mysql> flush privileges;
再获取status, 得到类似如下的输出:
mysql> show master status \G ;
*************************** 1. row ***************************
File: binlog.000002
Position: 156
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set: 1 row in set (0.00 sec)
5.登录MySQL从节点配置同步信息
- 另开一个tab登录mysql
mysql -u root -h 192.168.1.xx -P13307 -p123456 # 192.168.1.xx 是你本机的内网ip
- 在mysql client中操作:
mysql> stop slave; #注意其中的日志文件和数值要和上面show master status的值对应
mysql> CHANGE MASTER TO MASTER_HOST='你的本地ip地址如192.168.1.x',master_port=13306,MASTER_USER='slave',MASTER_PASSWORD='123456',MASTER_LOG_FILE='binlog.000002',MASTER_LOG_POS=156;
mysql> start slave;
再获取status, 正常应该得到类似如下的输出:
mysql> show slave status \G ;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.XX
Master_User: slave
Master_Port: 13306
Connect_Retry: 60
Master_Log_File: binlog.000002
Read_Master_Log_Pos: 156
Relay_Log_File: feb2e3f40b29-relay-bin.000002
Relay_Log_Pos: 329
Relay_Master_Log_File: mysql-bin-master.000002
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 656
Relay_Log_Space: 544
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 100
Master_UUID: 31ef5ac8-8d02-11e9-a2f6-0242ac120005
Master_Info_File: mysql.slave_master_info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
Master_public_key_path:
Get_master_public_key: 0
Network_Namespace:
1 row in set (0.00 sec)
ERROR:
No query specified
遇到错误排查:
1、sever_id 相同:
mysql>show variables like 'server_id';
如果主从相同会导致错误,可在从机中设置:
mysql>set global server_id=2;
2.密码编码问题:
通过本地去连接远程的mysql时报错,原因时mysql8.0的加密方法变了。
mysql8.0默认采用caching_sha2_password的加密方式
第三方客户端基本都不支持这种加密方式,只有自带的命令行支持
所以需要修改加密方式。
Last_IO_Errorno:2061
Last_IO_Error:error connection to master 'slave@192.168.1.XX:13305' - retry-time:60 retries 1 message:Authentication plugin 'cachinf_sha2_password' reported error: Authentication requires secure connection .
在主机中设置:
mysql>alter user 'slave'@'%' identified with mysql_native_password by '123456';
mysql>flush privileges;
从机中:
mysql>stop slave;
mysql>start slave;
mysql>show slave status \G;
6、添加数据测试
mysql> create database icloud;
mysql> use icloud;
mysql> create table one(id int(10) primary key ,name varchar(11) );
mysql> show tables;
mysql> insert into one (id ,name )values (1,'hello');
mysql> select * form one ;
# 如下:
mysql> select * from one ;
+----+------+
| id | name |
+----+------+
| 1 | hello |
+----+------+
1 row in set (0.00 sec)
在从机中查看是否同步
来源:oschina
链接:https://my.oschina.net/tianhuahua/blog/4299201