下载安装包
打开 MySQL 官网地址:https://dev.mysql.com/downloads/mysql/
安装
解压
tar -xzvf mysql-8.0.36-macos14-arm64.tar.gz
准备配置文件,如下是master的配置文件,slave的配置调整server-id 和相关路径即可。
[client]
default-character-set=utf8mb4
#password = your_password
port = 3306
#修改的socket文件的位置,默认是走的/tmp下的mysql.sock会有冲突
#这是报错 Another process with pid 77346 is using unix socket file.
#客户端也需要这个和服务端的一致
socket = /your-path/mysql.sock
[mysqld]
#开启gtid
enforce-gtid-consistency=true
gtid-mode=on
sync-binlog = 1
log-error = mysql.err
event_scheduler=ON
port = 3306
mysqlx_port = 33060
bind-address=127.0.0.1
#修改的socket文件的位置,默认是走的/tmp下的mysql.sock会有冲突
socket=/your-path/mysql.sock
mysqlx_socket=/your-path/mysql.sock
skip-external-locking
key_buffer_size = 16M
max_allowed_packet = 1M
table_open_cache = 64
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M
character-set-server=utf8mb4
init_connect='SET NAMES utf8mb4'
#修改mysql的主目录
basedir=/your-path/
#添加data文件的目录,存储各种数据和日志
datadir=/your-path/data
log-error = mysql.err
log-bin=mysql-bin
binlog_format=row
server-id = 1
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO
lower_case_table_names=1
[mysqldump]
quick
max_allowed_packet = 16M
[mysql]
no-auto-rehash
# Remove the next comment character if you are not familiar with SQL
#safe-updates
default-character-set=utf8mb4
[myisamchk]
key_buffer_size = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M
[mysqlhotcopy]
interactive-timeout
初始化阶段创建空密码的root@localhost账号
./mysqld --defaults-file=/your-path/my.cnf --initialize-insecure
初始化阶段创建带随机密码的root@localhost账号
./mysqld --defaults-file=/your-path/my.cnf --initialize
启动MySQL服务,并验证服务可用性情况。
./mysqld_safe --defaults-file=--defaults-file=/-path/my.cnf &
ps -ef | grep mysql
mysql -h127.0.0.1 -P3306 -uroot -p
配置双主同步
分别在主从两个库创建账号,并验证正常访问
create user 'repl'@'%' identified by 'repl';
grant replication slave on *.* to 'repl'@'%';
flush privileges;
# 查看主库的状态
show master status;
mysql -h 127.0.0.1 -urepl -P3306 -prepl
mysql -h 127.0.0.1 -urepl -P3307 -prepl
在两个数据库分别创建主从同步:
使用GTID方式创建同步:
change master to master_host='127.0.0.1',master_port=3306,master_user='repl',master_password='repl', master_auto_position=1;
使用Binlog位点的方式创建
#在上游主库获取binlog位置
show master status;
#在下游从库建立同步关系
change master to master_host='127.0.0.1',master_port=3306,master_user='repl',master_password='repl', master_log_file='mysql-bin.000003',master_log_pos=857;
start slave;
show salve status;
额外补充内容:
# 清理relay log同步信息
reset slave;
# 清理slave同步关系,包括账号访问等信息也会清理
reset slave all;
在主库重置binlog文件:
reset masetr;
开启半同步复制(after sync)
1.安装半同步的插件
主库
INSTALL PLUGIN rpl_semi_sync_master SONAME ‘semisync_master.so’;
从库
INSTALL PLUGIN rpl_semi_sync_slave SONAME ‘semisync_slave.so’;
show plugins;
查看是否安装成功
2.半同步需要在主从同时开启
主库
SET GLOBAL rpl_semi_sync_master_enabled = 1;
从库
SET GLOBAL rpl_semi_sync_slave_enabled = 1;
以上的启动方式是在命令行操作,也可写在配置文件中。
vim my.cnf
rpl_semi_sync_master_enabled = 1;
rpl_semi_sync_slave_enabled = 1;
3.重启从库的IO线程
STOP SLAVE IO_THREAD;
START SLAVE IO_THREAD;
4.确认半同步复制状态正常
mysql> show status like ‘%rpl_semi_sync%’ ;
±-------------------------------------------±------+
| Variable_name | Value |
±-------------------------------------------±------+
| Rpl_semi_sync_slave_status | ON |开启了半同步从库
| Rpl_semi_sync_source_clients | 1 |半同步复制的从库数量
| Rpl_semi_sync_source_net_avg_wait_time | 0 |等待从库的平均应答时间
| Rpl_semi_sync_source_net_wait_time | 0 |等待从库的总应答时间
| Rpl_semi_sync_source_net_waits | 3 |等待从库的应答次数
| Rpl_semi_sync_source_no_times | 1 |退化为异步复制的次数
| Rpl_semi_sync_source_no_tx | 3 |从库未成功确认提交的次数
| Rpl_semi_sync_source_status | ON |开启了半同步主库
| Rpl_semi_sync_source_timefunc_failures | 0 |调用时间函数失败次数
| Rpl_semi_sync_source_tx_avg_wait_time | 368 |主库等待事务的平均时间
| Rpl_semi_sync_source_tx_wait_time | 737 |主库等待事务总时间
| Rpl_semi_sync_source_tx_waits | 2 |主库等待事务总次数
| Rpl_semi_sync_source_wait_pos_backtraverse | 0 |
| Rpl_semi_sync_source_wait_sessions | 0 |正在等待从库应答的会话数
| Rpl_semi_sync_source_yes_tx | 2 |从库确认成功提交的次数
±-------------------------------------------±------+
15 rows in set (0.06 sec)
参考:
mysql> show variables like ‘%rpl_semi_sync%’ ;
±--------------------------------------------±-----------+
| Variable_name | Value |
±--------------------------------------------±-----------+
| rpl_semi_sync_slave_enabled | ON |开启从库半同步复制
| rpl_semi_sync_slave_trace_level | 32 |从库调试跟踪级别
| rpl_semi_sync_source_enabled | ON |开启主库半同步复制
| rpl_semi_sync_source_timeout | 10000 |主库半同步等待10s,超时退化为异步复制
| rpl_semi_sync_source_trace_level | 32 |主库调试跟踪级别
| rpl_semi_sync_source_wait_for_replica_count | 1 |默认值,主库收到从库响应的个数,达到该数值主库就认为已经完成复制
| rpl_semi_sync_source_wait_no_replica | ON |默认值,允许在超时时间内从库小于xxx_replica_count的值,继续维持半同步复制
| rpl_semi_sync_source_wait_point | AFTER_SYNC |默认值,开启无损半同步复制,也叫增强半同步
±--------------------------------------------±-----------+
8 rows in set (0.06 sec)
caching_sha2_password 报错排查
Last_IO_Error: Error connecting to source ‘repl@127.0.0.1:3306’. This was attempt 5/86400, with a delay of 60 seconds between attempts. Message: Authentication plugin ‘caching_sha2_password’ reported error: Authentication requires secure connection.
mysql -u repl -p -h 127.0.0.1 -P3307 --get-server-public-key
原因:
在从库连接主库的时候使用的是不被 caching_sha2_password认可的RSA公钥,所以主库MySQL拒绝了数据库连接的请求,从而,从库报错’caching_sha2_password’ reported error:Authentication require secure connection。
解决:
官网给出的解决方案如下:
要从服务器请求RSA公钥,需要指定选项 --get-server-public-key 。
从服务器请求基于RSA密钥对的密码交换所需的公共密钥。此选项适用于使用caching_sha2_password身份验证插件进行身份验证的客户端 。对于该插件,除非请求,否则服务器不会发送公钥。对于未使用该插件进行身份验证的帐户,将忽略此选项。如果未使用基于RSA的密码交换,也将被忽略,例如客户端使用安全连接连接到服务器时。
或者,如果客户端的文件包含服务器所需的RSA公钥的本地副本,则可以使用—server-public-key-path选项指定文件 。
具体为:
方案1:
使用复制用户请求服务器公钥:
mysql -u repl -p -h 127.0.0.1 -P3307 --get-server-public-key
在这种情况下,服务器将RSA公钥发送给客户端,后者使用它来加密密码并将结果返回给服务器。插件使用服务器端的RSA私钥解密密码,并根据密码是否正确来接受或拒绝连接。
重新在从库配置change masrer to并且start slave,复制可以正常启动。
方案2:
使用复制用户请求服务器公钥:
mysql -u repl -p123 -h 118.31.127.96 -P3307 --server-public-key-path=/mysqldata/my3308/data/public_key1.pem
重新在从库配置change masrer to并且start slave,复制可以正常启动。
方案3:
修改repl用户,使其使用别的秘密加密方式,不使用插件caching_sha2_password。
CREATE USER 'repl'@'%' IDENTIFIED WITH 'mysql_native_password' BY 'XXXX';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';




