搭建主从的步骤
1.主库配置server_id
复制架构里的每个服务器都得配个独一无二的 ID,你可以用 server_id
这个系统变量来指定。
这个 ID 是用来区分复制架构里各个服务器的,得是个正整数,范围在 1 到(2^32 )−1 之间,你随便怎么选,只要不和这个主从同步的架构中其他的服务器id一样。
MySQL 8.0 默认的 server_id
值是 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
)。
可在 MySQL 运行时通过 SQL 命令动态调整,但需注意:
○ 临时生效:重启后失效,需结合配置文件修改永久生效。
○ 操作示例:
SET GLOBAL server_id = 123456;
在启动 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;