首先感谢一下前辈贡献的文章。
没事了就琢磨一下技术,这次是搞主从复制。
由于是自学,所以去百度了一下,随机找到一篇文章就开始练习。。。
但是这篇文章并不符合我的情况,所以很遗憾,失败了,而且一直失败。。。
不过没关系,继续找相关文章,一遍一遍的阅读,一步一步操作,嗯~,对,就是这样,继续失败。。。
good nice!
上我的操作步骤:
服务器环境:
- CentOS7.4
- mysql8
主从复制技术要求:
- 两台服务器(一主,一从)
- 分别建立空库:mytest(InnoDB引擎)
- 准备好创建数据表的SQL语句
CREATE TABLE `t_test` ( `id` int(10) NOT NULL AUTO_INCREMENT COMMENT 'ID', `name` varchar(100) DEFAULT NULL COMMENT '名称', PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB COMMENT='测试表';
let`s go !
先来主服务器:
- find / name my.cnf
- 打开配置
- 找到[mysqld]模块
写入这几行代码(目前我没有复杂的需求,只要配置成功,能复制就可以了)# 日志文件(没有就自己创建并授权) log-bin=/var/log/mysql/mysql-bin # 持久性:为了在使用带事务的InnoDB进行复制设置时尽可能提高持久性 innodb_flush_log_at_trx_commit = 1 # 一致性: 1表示每次事务提交后,就将数据刷到磁盘,安全;0表示MySQL不控制binlog的刷新, # 由文件系统自己控制它的缓存的刷新,不安全,牺牲了数据一致性 sync_binlog = 1 # 以上配置的作用,参考这篇文章:https://www.cnblogs.com/xuxubaobao/p/10839979.html # 主服务器ID(理解为编号吧,可以使ip最后一段) server-id = 1 # 要复制的表(先就这么理解)(开始不要心大,只复制一个数据库就好了) binlog-do-db=mytest # 温馨提示: # innodb_flush_log_at_trx_commit和sync_binlog 两个参数是控制MySQL磁盘写入策略,以及数据安全性 # 的关键参数,当两个参数都设置为1的时候写入性能最差, # 推荐做法是innodb_flush_log_at_trx_commit=2,sync_binlog=100
- 保存配置,重启
systemctl restart mysqld
再来从服务器:
- find / name my.cnf
- 打开配置
- 找到[mysqld]模块
# 从服务器ID(理解为编号吧) server-id = 2 # 要复制的数据库 replicate-do-db=mytest #master-host=49.4.32.91 //这些不用放在这里(看其它文章这样写的,经测试不需要) #master-user=repl //这些不用放在这里 #master-password=QFedu123! //这些不用放在这里 #master-port=3306 //这些不用放在这里
服务器配置就这些......
==========================================
下面开始配置数据库。
配置主库:
- 确保在主服务器上 skip_networking 选项处于 OFF 关闭状态, 这是默认值。
如果是启用的,则从站无法与主站通信,并且复制失败。show variables like '%skip_networking%';
- 创建一个专门用于复制数据的用户
CREATE USER 'repl'@'%' ;
-
创建可复制的权限
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' identified by 'a123456';
每个从服务器,需要使用MySQL主服务器上的用户名,和密码连接到主服务器。例如,使用用户
repl
可以从任何主机上连接到master
上进行复制操作, 并且用户repl
仅可以使用复制的权限。 -
查看主库master_log_file、master_log_pos值
show master status; -- 执行sql
配置从库:
- 先确定从库同步服务已停止
stop slave;-- 在命令行中执行
- 配置从库与主库通信参数
-- 在mysql中执行 change master to master_host='49.4.32.91',-- 主服务器的主机名(也可以是 IP) master_user='repl',-- 连接到主服务器的用户 master_password='a123456',-- 到主服务器的密码 master_port=3306, master_log_file='mysql-bin.000001',-- 这里对应主库的值(show master status出来的master_log_file值) master_log_pos=801;-- 这里对应主库的值(show master status出来的master_log_pos值)
- 启动从服务器的复制线程(根据需要停止和启动,因为要测试很多次,在mysql从库中执行:stop slave和start slave)
start slave;-- 在命令行中执行
-
检查是否启动成功:(在从库mysql中执行)
show slave status; -- 执行sql
上图:
主要看这两个值是不是yes,我一开始不是,第一个总是No,解决方法参考文章
https://blog.csdn.net/itjackhe/article/details/105426122?utm_medium=distribute.pc_relevant_download.none-task-blog-baidujs-1.nonecase&depth_1-utm_source=distribute.pc_relevant_download.none-task-blog-baidujs-1.nonecase
主要是因为主库的master_log_file、master_log_pos值,与从库连接参数的值不一致。
最后结果:完全一致。
后续更新更多经验上来,搞熟练,搞撑(chen)抖(tou)。
好了,回家恰饭。
=======================[几天之后]========================
上来先说结论:这几天抽空学会了主从复制技术,目前会的模式是一主多从。20210318。
不会的时候觉得很难,会了之后觉得挺简单。按照本文来操作即可。
=======================================================
重要配置(在学会主从复制技术之前以下步骤可跳过)(暂未测试):
-
主库配置好之后加读锁,主库加只读锁,防止在数据同步时,主库新增数据
flush table with read lock; -- 主数据库加锁,只允许读取数据
unlock tables;-- 主数据库恢复可写指令 (此操作可放到备份数据并记录binlog日志文件和位置时去执行)
-
使用mysqldump命令进行备份数据库mysqldump -uroot -p -A -F --master-data=2|gzip > /root/rep.sql.gz
-A 备份全部数据库
-F 刷新二进制日志
--master-data=2 追加二进制位置和文件输出到sql中
gzip 将mysqldump的数据压缩,节省存储空间
将压缩文件上传到从服务器.并导入到从库中gunzip
-
END