mysql8.0.24及之后版本的主从同步

搭建主从的步骤

1.主库配置server_id

复制架构里的每个服务器都得配个独一无二的 ID,你可以用 server_id 这个系统变量来指定。
这个 ID 是用来区分复制架构里各个服务器的,得是个正整数,范围在 1 到(2^32 )−1 之间,你随便怎么选,只要不和这个主从同步的架构中其他的服务器id一样。
MySQL 8.0 默认的 server_id 值是 1。
配置方法:

  1. 通过配置文件修改(推荐)

文件路径:MySQL 的配置文件通常为 my.cnf(Linux)或 my.ini(Windows)。可通过命令 which mysqld 或 mysqld --verbose --help | grep "Default options" 定位文件路径。
配置步骤

	[mysqld]
	server_id = 123456  # 需为 1~4294967295 的唯一整数

修改后需重启 MySQL 服务使配置生效(例如 sudo systemctl restart mysqld)。

  1. 通过命令行临时修改

可在 MySQL 运行时通过 SQL 命令动态调整,但需注意:
临时生效:重启后失效,需结合配置文件修改永久生效。
操作示例

SET GLOBAL server_id = 123456;
  1. 通过启动参数指定

在启动 MySQL 服务时添加 --server-id=123456 参数,适用于临时调试场景

2.主库必须开启二进制日志

早些年 MySQL 版本里,二进制日志默认是关着的,得手动开一下。但从 8.0 开始,二进制日志默认就开了,你用不用 --log-bin 选项都一样。不过有个特例,你要是手动用 mysqld 初始化数据目录,还用--initialize--initialize-insecure 选项,那二进制日志默认就关着。这时候你指定一下--log-bin选项,二进制日志就能开了。一旦二进制日志开了,那个 log_bin 系统变量,显示服务器上二进制日志状态,就自动变成 ON 了。

要是你不用 --log-bin 这个选项,MySQL 就会用 binlog 当二进制日志文件的默认基础名。为了跟老版本兼容,你要是给 --log-bin 选项不带字符串或者空字符串,那基础名就默认用 host_name-bin,用主机的名字。

二进制日志文件默认存放在数据目录里。要是想换个地方放,可以用 --log-bin 这个选项,在基本名字前面加个绝对路径名,指定个新目录就行。服务器读二进制日志索引文件(这个文件记着用过的二进制日志文件)的时候,会瞅瞅里面是不是有相对路径。要是真有,那相对的部分就会被换成用 --log-bin 选项设的绝对路径。二进制日志索引文件里记的绝对路径是不会变的;这种情况下,就得手动改改索引文件,才能让新路径或者新路径能用上。二进制日志文件的基本名字和指定的路径,都能通过 log_bin_basename 这个系统变量查到。

3.从库配置server_id

不可以设置为0,不然就接不上主库了。

4.从库的二进制日志的配置

所有服务器默认都开启了二进制日志。
复制过程并不一定需要从库也开启二进制日志,不过从库开启二进制日志的话,它的二进制日志就能用来做数据备份和故障恢复。开启二进制日志的从库还能作为更复杂复制拓扑的一部分使用,这里暂不讨论
你要是得在从库上关掉二进制日志或从库更新日志,可以指定 --skip-log-bin--log-replica-updates=OFF--log-slave-updates=OFF 这个选项给从库。你要是又想重新打开这些功能,就把相关选项去掉,重启下服务器就行。

5.主库创建用于同步的用户

每个从库都得用 MySQL 用户名和密码连上主库,所以得在主库上给从库搞个能用得上的用户账号。这用户名啊,是在搭从库的时候,用 CHANGE REPLICATION SOURCE TO 语句的 SOURCE_USER | MASTER_USER 选项指定的。啥账号都能用,只要它有 REPLICATION SLAVE 这个权限就行。你可以给每个从库单独搞个账号,也可以让所有从库都共用一个账号连上主库。
这里直接创建一个账号

mysql> CREATE USER 'repl'@'%.example.com' IDENTIFIED BY 'password';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%.example.com';

6.获取数据快照用于第一次给从库同步数据(主库无数据则跳到8)

主库库里头有现成数据,就得把它拷贝到每个从库上。从主库倒数据有各种法子
mysqldump 工具把你想复制的所有数据库都倒出来。这可是推荐的法子,尤其是用 InnoDB 的时候。
如果你的数据库是存放在二进制可移植文件里的,你可以直接把原始数据文件拷贝到副本上。这样比用mysqldump然后每个副本都导入文件要高效得多,因为它省去了每次重放INSERT语句时更新索引的麻烦。不过像 InnoDB 这种存储引擎就不太建议这么干。
用 MySQL 服务器的克隆插件把现有副本的所有数据都转移到克隆副本上。 (这里暂时不做扩展,后面学习了再写)
用 mysqldump 创建数据快照
这个语句会把所有数据库都导出到一个叫 dbdump.db 的文件里。

mysqldump --all-databases --source-data=1 > dbdump.db

● 参数说明:
--source-data=1:生成未注释的 CHANGE MASTER 语句,适合直接用于主从复制配置。
--source-data=2:生成注释的 CHANGE MASTER 语句,适合单机备份后手动指定 Binlog 位置。
权限拒绝错误(ERROR 1045)的解决方案
错误原因
● 无密码认证失败:命令中未通过 -p 参数提供密码,或密码为空(using password: NO)。
● 权限配置问题:用户root@localhost的权限被限制,或密码加密方式不兼容(常见于 MySQL 8.0)
分步解决
1. 检查密码输入方式
在命令中显式指定密码(避免明文暴露,推荐配置文件方式):

mysqldump -u root -p你的密码 --all-databases --source-data=1 > dbdump.db

或 使用交互式输入密码(更安全):

mysqldump -u root -p --all-databases --source-data=1 > dbdump.db

2. 重置 root 密码(若忘记密码)
需暂时跳过权限验证:

# 停止 MySQL 服务
systemctl stop mysql

# 启动 MySQL 并跳过权限验证
mysqld_safe --skip-grant-tables &

# 登录 MySQL
mysql -u root

# 重置密码(MySQL 8.0+)
mysql>ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码';
mysql>FLUSH PRIVILEGES;

完成后重启 MySQL 服务

导出的文件位置在执行该命令的所处目录,实在找不到可以执行 find / -name "dbdump.db" 2>/dev/null

7.从库处理dbdump.db文件

dbdump.db上传到从库所处的服务器 ,如果是docker记得将文件拷贝进容器内

docker cp /宿主机路径/dbdump.db 容器ID:/目标路径/

然后执行

mysql -uroot -p < /目标路径/dbdump.db

8.从库配置复制的用户开始同步

注意修改成刚刚创建的用户的信息,在mysql中的命令行进行操作

mysql>CHANGE REPLICATION SOURCE TO
     SOURCE_HOST='source_host_name',
     SOURCE_USER='replication_user_name',
     SOURCE_PASSWORD='replication_password',
     MASTER_AUTO_POSITION=1;  -- 使用GTID自动定位
--启动复制
mysql>START REPLICA; 
--查看同步情况
mysql>SHOW REPLICA STATUS\G;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值