分库分表 3:主从复制 (从入门到精通)
文章很长,而且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录 语雀版 | 总目录 码云版| 总目录 博客园版 为您奉上珍贵的学习资源 :
-
免费赠送 :《尼恩Java面试宝典》持续更新+ 史上最全 + 面试必备 2000页+ 面试必备 + 大厂必备 +涨薪必备
-
免费赠送 经典图书:《Java高并发核心编程(卷1)》 面试必备 + 大厂必备 +涨薪必备 加尼恩免费领
-
免费赠送 经典图书:《Java高并发核心编程(卷2)》 面试必备 + 大厂必备 +涨薪必备 加尼恩免费领
-
免费赠送 经典图书:《Netty Zookeeper Redis 高并发实战》 面试必备 + 大厂必备 +涨薪必备 加尼恩免费领
-
免费赠送 经典图书:《SpringCloud Nginx高并发核心编程》 面试必备 + 大厂必备 +涨薪必备 加尼恩免费领
-
免费赠送 资源宝库: Java 必备 百度网盘资源大合集 价值>10000元 加尼恩领取
推荐:入大厂 、做架构、大力提升Java 内功 的 精彩博文
入大厂 、做架构、大力提升Java 内功 必备的精彩博文 | 秋招涨薪1W + 必备的精彩博文 |
---|---|
1:Redis 分布式锁 (图解-秒懂-史上最全) | 2:Zookeeper 分布式锁 (图解-秒懂-史上最全) |
3: Redis与MySQL双写一致性如何保证? (面试必备) | 4: 面试必备:秒杀超卖 解决方案 (史上最全) |
5:面试必备之:Reactor模式 | 6: 10分钟看懂, Java NIO 底层原理 |
7:TCP/IP(图解+秒懂+史上最全) | 8:Feign原理 (图解) |
9:DNS图解(秒懂 + 史上最全 + 高薪必备) | 10:CDN图解(秒懂 + 史上最全 + 高薪必备) |
11: 分布式事务( 图解 + 史上最全 + 吐血推荐 ) | 12:限流:计数器、漏桶、令牌桶 三大算法的原理与实战(图解+史上最全) |
13:架构必看:12306抢票系统亿级流量架构 (图解+秒懂+史上最全) |
14:seata AT模式实战(图解+秒懂+史上最全) |
15:seata 源码解读(图解+秒懂+史上最全) | 16:seata TCC模式实战(图解+秒懂+史上最全) |
SpringCloud 微服务 精彩博文 | |
---|---|
nacos 实战(史上最全) | sentinel (史上最全+入门教程) |
SpringCloud gateway (史上最全) | 分库分表sharding-jdbc底层原理与实操(史上最全,5W字长文,吐血推荐) |
推荐:尼恩Java面试宝典(持续更新 + 史上最全 + 面试必备)具体详情,请点击此链接
尼恩Java面试宝典,32个最新pdf,含2000多页,不断更新、持续迭代 具体详情,请点击此链接
目录:分库分表 Sharding-JDBC从入门到精通
主题 | 链接地址 |
---|---|
准备1: 在window安装虚拟机集群 | 分布式 虚拟机 linux 环境制作 GO |
准备2:在虚拟机的各个节点有 mysql | centos mysql 笔记(内含vagrant mysql 镜像)GO |
分库分表 -Sharding-JDBC- 从入门到精通 1 | Sharding-JDBC 分库、分表(入门实战) GO |
分库分表 -Sharding-JDBC- 从入门到精通 2 | Sharding-JDBC 基础知识 GO |
分库分表 Sharding-JDBC 从入门到精通之 3 | 自定义主键、分布式雪花主键,原理与实战 GO |
分库分表 -Sharding-JDBC- 从入门到精通 4 | MYSQL集群主从复制,原理与实战 GO |
分库分表 Sharding-JDBC 从入门到精通之 5 | 读写分离 实战 GO |
分库分表 Sharding-JDBC 从入门到精通之 6 | Sharding-JDBC执行原理 GO |
分库分表 Sharding-JDBC 从入门到精通之源码 | git仓库地址GO |
目录:分库分表 Sharding-JDBC从入门到精通
主题 | 链接地址 |
---|---|
准备1: 在window安装虚拟机集群 | 分布式 虚拟机 linux 环境制作 GO |
准备2:在虚拟机的各个节点有 mysql | centos mysql 笔记(内含vagrant mysql 镜像)GO |
分库分表 -Sharding-JDBC- 从入门到精通 1 | Sharding-JDBC 分库、分表(入门实战) GO |
分库分表 -Sharding-JDBC- 从入门到精通 2 | Sharding-JDBC 基础知识 GO |
分库分表 Sharding-JDBC 从入门到精通之 3 | 自定义主键、分布式雪花主键,原理与实战 GO |
分库分表 -Sharding-JDBC- 从入门到精通 4 | MYSQL集群主从复制,原理与实战 GO |
分库分表 Sharding-JDBC 从入门到精通之 5 | 读写分离 实战 GO |
分库分表 Sharding-JDBC 从入门到精通之 6 | Sharding-JDBC执行原理 GO |
分库分表 Sharding-JDBC 从入门到精通之源码 | git仓库地址GO |
MYSQL主从复制配置
1 练习的场景
主从实战的数据库场景:
建议有三虚拟机:cdh1、 cdh2、 cdh3(cdh3可以不开启)。
cdh1 上的 user_db为主,cdh1 上的 user_db为从,仅仅开启这两个库的复制,其他的库如store,不开启主从复制。
有关学习环境的快速搭建,请参考本系列博客的准备一: 在window安装虚拟机集群 。
2 配置主数据库
登录主库
mysql ‐uroot ‐p123456
创建用于主从复制的账号
set global validate_password_policy=0;
set global validate_password_length=1;
create user db_sync identified by '123456';
创建库和表
mysql> CREATE DATABASE user_db DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
Query OK, 1 row affected (0.00 sec)
mysql> use user_db;
Database changed
mysql> create table t_user_0( id bigint , name varchar(40) );
Query OK, 0 rows affected (0.02 sec)
授权主备复制专用账号
GRANT REPLICATION SLAVE ON *.* TO 'db_sync'@'%' IDENTIFIED BY 'db_sync';
刷新权限
FLUSH PRIVILEGES;
修改 MySQL 配置文档 /etc/my.cnf,在 [mysqld] 段添加以下配置:
[mysqld]
#开启日志,启用二进制日志
log‐bin = mysql‐bin
#设置服务器标识ID,主从不能一致 ,每台服务器唯一
server‐id = 1
#设置需要同步的数据库
binlog‐do‐db=user_db
#屏蔽不需要同步的数据库
binlog‐ignore‐db=mysql
binlog‐ignore‐db=information_schema
binlog‐ignore‐db=performance_schema
binlog‐ignore‐db=dolphinscheduler
binlog‐ignore‐db=sys
binlog‐ignore‐db=store
参数说明:
log-bin
该参数只要配置就表示开启了MySQL的bin log日志功能,注意改参数的值是我们自定义的,我们自定义的值将作为bin log的名称的前缀信息哟,我们可以使用MySQL命令"show variables like '%log_bin%';"查看咱们的配置。server-id
该参数可以指定数据库服务器的唯一标识。在同一个复制组下的所有实例的server_id都必须是唯一的,而且取值必须是正整数,取值范围是1~(232)−1
可以通过show databases,查看所有的库,然后找出不需要同步的数据库
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| dolphinscheduler |
| mysql |
| performance_schema |
| store |
| sys |
+--------------------+
6 rows in set (0.01 sec)
完整配置如下:
[root@cdh1 ~]# cat /etc/my.cnf
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html
[mysqld]
log-bin=user-mysql-bin
server-id=1
binlog-do-db=user_db
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=dolphinscheduler
binlog-ignore-db=sys
binlog-ignore-db=store
skip-name-resolve
character_set_server=utf8
init_connect='SET NAMES utf8'
lower_case_table_names=1
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
3 配置从服务器
登录从库
mysql ‐uroot ‐p123456
创建用于主从复制的账号
set global validate_password_policy=0;
set global validate_password_length=1;
create user db_sync identified by '123456';
创建库和表
mysql> CREATE DATABASE user_db DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
Query OK, 1 row affected (0.00 sec)
mysql> use user_db;
Database changed
mysql> create table t_user_0( id bigint , name varchar(40) );
Query OK, 0 rows affected (0.02 sec)
授权主备复制专用账号
GRANT REPLICATION SLAVE ON *.* TO 'db_sync'@'%' IDENTIFIED BY '123456';
刷新权限
FLUSH PRIVILEGES;
修改 MySQL 配置文档 /etc/my.cnf,在 [mysqld] 段添加以下配置:
[mysqld]
log‐bin=mysql‐bin #开启日志,启用二进制日志
server‐id=2 #设置服务器标识ID,主从不能一致 ,每台服务器唯一
#设置需要同步的数据库
replicate_wild_do_table=user_db.%
#屏蔽系统库同步
replicate_wild_ignore_table=mysql.%
replicate_wild_ignore_table=information_schema.%
replicate_wild_ignore_table=performance_schema.%
replicate_wild_ignore_table=dolphinscheduler.%
replicate_wild_ignore_table=sys.%
replicate_wild_ignore_table=store.%
重启数据库
systemctl restart mysqld
完整的配置文件如下:
[root@cdh2 ~]# vim /etc/my.cnf
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html
[mysqld]
log-bin=user-mysql-bin
server-id=101
replicate_wild_do_table=user_db.%
replicate_wild_ignore_table=mysql.%
replicate_wild_ignore_table=information_schema.%
replicate_wild_ignore_table=performance_schema.%
replicate_wild_ignore_table=dolphinscheduler.%
replicate_wild_ignore_table=sys.%
replicate_wild_ignore_table=store.%
skip-name-resolve
character_set_server=utf8
init_connect='SET NAMES utf8'
lower_case_table_names=1
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
目录:分库分表 Sharding-JDBC从入门到精通
主题 | 链接地址 |
---|---|
准备1: 在window安装虚拟机集群 | 分布式 虚拟机 linux 环境制作 GO |
准备2:在虚拟机的各个节点有 mysql | centos mysql 笔记(内含vagrant mysql 镜像)GO |
分库分表 -Sharding-JDBC- 从入门到精通 1 | Sharding-JDBC 分库、分表(入门实战) GO |
分库分表 -Sharding-JDBC- 从入门到精通 2 | Sharding-JDBC 基础知识 GO |
分库分表 Sharding-JDBC 从入门到精通之 3 | 自定义主键、分布式雪花主键,原理与实战 GO |
分库分表 -Sharding-JDBC- 从入门到精通 4 | MYSQL集群主从复制,原理与实战 GO |
分库分表 Sharding-JDBC 从入门到精通之 5 | 读写分离 实战 GO |
分库分表 Sharding-JDBC 从入门到精通之 6 | Sharding-JDBC执行原理 GO |
分库分表 Sharding-JDBC 从入门到精通之源码 | git仓库地址GO |
目录:分库分表 Sharding-JDBC从入门到精通
主题 | 链接地址 |
---|---|
准备1: 在window安装虚拟机集群 | 分布式 虚拟机 linux 环境制作 GO |
准备2:在虚拟机的各个节点有 mysql | centos mysql 笔记(内含vagrant mysql 镜像)GO |
分库分表 -Sharding-JDBC- 从入门到精通 1 | Sharding-JDBC 分库、分表(入门实战) GO |
分库分表 -Sharding-JDBC- 从入门到精通 2 | Sharding-JDBC 基础知识 GO |
分库分表 Sharding-JDBC 从入门到精通之 3 | 自定义主键、分布式雪花主键,原理与实战 GO |
分库分表 -Sharding-JDBC- 从入门到精通 4 | MYSQL集群主从复制,原理与实战 GO |
分库分表 Sharding-JDBC 从入门到精通之 5 | 读写分离 实战 GO |
分库分表 Sharding-JDBC 从入门到精通之 6 | Sharding-JDBC执行原理 GO |
分库分表 Sharding-JDBC 从入门到精通之源码 | git仓库地址GO |
MYSQL主从复制配置
1 练习的场景
主从实战的数据库场景:
建议有三虚拟机:cdh1、 cdh2、 cdh3(cdh3可以不开启)。
cdh1 上的 user_db为主,cdh1 上的 user_db为从,仅仅开启这两个库的复制,其他的库如store,不开启主从复制。
有关学习环境的快速搭建,请参考本系列博客的准备一: 在window安装虚拟机集群 。
2 配置主数据库
登录主库
mysql ‐uroot ‐p123456
创建用于主从复制的账号
set global validate_password_policy=0;
set global validate_password_length=1;
create user db_sync identified by '123456';
创建库和表
mysql> CREATE DATABASE user_db DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
Query OK, 1 row affected (0.00 sec)
mysql> use user_db;
Database changed
mysql> create table t_user_0( id bigint , name varchar(40) );
Query OK, 0 rows affected (0.02 sec)
授权主备复制专用账号
GRANT REPLICATION SLAVE ON *.* TO 'db_sync'@'%' IDENTIFIED BY 'db_sync';
刷新权限
FLUSH PRIVILEGES;
修改 MySQL 配置文档 /etc/my.cnf,在 [mysqld] 段添加以下配置:
[mysqld]
#开启日志,启用二进制日志
log‐bin = mysql‐bin
#设置服务器标识ID,主从不能一致 ,每台服务器唯一
server‐id = 1
#设置需要同步的数据库
binlog‐do‐db=user_db
#屏蔽不需要同步的数据库
binlog‐ignore‐db=mysql
binlog‐ignore‐db=information_schema
binlog‐ignore‐db=performance_schema
binlog‐ignore‐db=dolphinscheduler
binlog‐ignore‐db=sys
binlog‐ignore‐db=store
参数说明:
log-bin
该参数只要配置就表示开启了MySQL的bin log日志功能,注意改参数的值是我们自定义的,我们自定义的值将作为bin log的名称的前缀信息哟,我们可以使用MySQL命令"show variables like '%log_bin%';"查看咱们的配置。server-id
该参数可以指定数据库服务器的唯一标识。在同一个复制组下的所有实例的server_id都必须是唯一的,而且取值必须是正整数,取值范围是1~(232)−1
可以通过show databases,查看所有的库,然后找出不需要同步的数据库
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| dolphinscheduler |
| mysql |
| performance_schema |
| store |
| sys |
+--------------------+
6 rows in set (0.01 sec)
完整配置如下:
[root@cdh1 ~]# cat /etc/my.cnf
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html
[mysqld]
log-bin=user-mysql-bin
server-id=1
binlog-do-db=user_db
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=dolphinscheduler
binlog-ignore-db=sys
binlog-ignore-db=store
skip-name-resolve
character_set_server=utf8
init_connect='SET NAMES utf8'
lower_case_table_names=1
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
3 配置从服务器
登录从库
mysql ‐uroot ‐p123456
创建用于主从复制的账号
set global validate_password_policy=0;
set global validate_password_length=1;
create user db_sync identified by '123456';
创建库和表
mysql> CREATE DATABASE user_db DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
Query OK, 1 row affected (0.00 sec)
mysql> use user_db;
Database changed
mysql> create table t_user_0( id bigint , name varchar(40) );
Query OK, 0 rows affected (0.02 sec)
授权主备复制专用账号
GRANT REPLICATION SLAVE ON *.* TO 'db_sync'@'%' IDENTIFIED BY '123456';
刷新权限
FLUSH PRIVILEGES;
修改 MySQL 配置文档 /etc/my.cnf,在 [mysqld] 段添加以下配置:
[mysqld]
log‐bin=mysql‐bin #开启日志,启用二进制日志
server‐id=2 #设置服务器标识ID,主从不能一致 ,每台服务器唯一
#设置需要同步的数据库
replicate_wild_do_table=user_db.%
#屏蔽系统库同步
replicate_wild_ignore_table=mysql.%
replicate_wild_ignore_table=information_schema.%
replicate_wild_ignore_table=performance_schema.%
replicate_wild_ignore_table=dolphinscheduler.%
replicate_wild_ignore_table=sys.%
replicate_wild_ignore_table=store.%
重启数据库
systemctl restart mysqld
完整的配置文件如下:
[root@cdh2 ~]# vim /etc/my.cnf
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html
[mysqld]
log-bin=user-mysql-bin
server-id=101
replicate_wild_do_table=user_db.%
replicate_wild_ignore_table=mysql.%
replicate_wild_ignore_table=information_schema.%
replicate_wild_ignore_table=performance_schema.%
replicate_wild_ignore_table=dolphinscheduler.%
replicate_wild_ignore_table=sys.%
replicate_wild_ignore_table=store.%
skip-name-resolve
character_set_server=utf8
init_connect='SET NAMES utf8'
lower_case_table_names=1
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
4 主从复制的配置
4.1 设置主库
首先连接 master db,为从库的账号授予复制的权利
GRANT REPLICATION SLAVE ON *.* TO 'db_sync'@'%' IDENTIFIED BY '123456';
如果权限不够,就执行一下下面的两句:
set global validate_password_policy=0;
set global validate_password_length=1;
刷新权限
FLUSH PRIVILEGES;
在主库查看同步的起点, 记录下文件名以及起点 位置
show master status;
查看数据库状态:
记录 File 的值( user-mysql-bin.000001 )和 Position 的值(154),等会配置 slave 服务器的时候要用。
4.2设置从库
接下来在 slave db上,配置主从复制:
先停止同步
STOP SLAVE;
修改从库的master配置,指向到主库,配置过程中,需要使用上一步记录的文件名以及位点
mysql>change master to
master_host='cdh1',
master_user='db_sync',
master_log_file='user-mysql-bin.000001',
master_log_pos=154,
master_port=3306,
master_password='123456';
Query OK, 0 rows affected, 2 warnings (0.03 sec)
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
解释下配置参数
master_host='x.x.x.x' // 这里填 master 主机 ip
master_log_file='user-mysql-bin.000001', // 这里填写 File 的值
master_log_pos=154,// 这里填写 Position 的值。
启动同步
START SLAVE;
查看同步
show slave status\G;
结果如下:
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: cdh1
Master_User: db_sync
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: user-mysql-bin.000002
Read_Master_Log_Pos: 154
Relay_Log_File: cdh2-relay-bin.000004
Relay_Log_Pos: 377
Relay_Master_Log_File: user-mysql-bin.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: user_db.%
Replicate_Wild_Ignore_Table: mysql.%,information_schema.%,performance_schema.%,dolphinscheduler.%,sys.%,store.%
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 154
Relay_Log_Space: 2531
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: 1
Master_UUID: fb8d483c-47eb-11eb-ba17-0800276c3e95
Master_Info_File: /var/lib/mysql/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:
1 row in set (0.00 sec)
查看Slave_IO_Runing和Slave_SQL_Runing字段值都为Yes,表示同步配置成功。如果不为Yes,请排
查相关异常。
如果不小心配置错, 输入 mysql> stop slave; 然后重新录入一遍就可以了。
5 问题:
问题1: 由于是克隆的虚拟机,所以mysql的uuid相同,报错如下:
The slave I/O thread stops because master and slave have equal MySQL server UUID
原因:主从复制的mysql实例的uuid不能相同。
修改方法:在从库上,从my.cnf找到data目录,然后定位到auto.cnf目录,找到 auto.cnf文件,进行uuid的调整。
具体如下:
$ vim /var/lib/mysql/auto.cnf
[auto]
server-uuid=fb8d483c-47eb-11eb-ba17-0800276c3e96
修改之后:
[root@cdh2 ~]# cat /var/lib/mysql/auto.cnf
[auto]
server-uuid=fb8d483c-47eb-11eb-ba17-0800276c3e96
最终,确保两个mysql 实例的uuid不同。
然后,重启改动过的实例。
6 主从复制测试
1 将主库的t_user_0表复制一份t_user_0_copy1,稍等一会,刷新从库,发现从库也有了一个t_user_0_copy1表,表明从库复制了主库的t_user_0_copy1表。
2 修改主库的t_user_0_copy1,名称为t_user_1,大约过去10s,刷新从库,从库的t_user_0_copy1名称改为t_user_1
Note: 这里只是演示,所以把数据表也同步过来了。一般情况下数据表是不同步的,先各自在 master 和 salve 创建好。 因为一般来说 master 和 slave 的表的存储引擎是不一样的,master 一般用的是 InnoDB,因为它要写数据比较多。 而 slave 表一般用的是 MyISAM 引擎,因为它是没有写数据操作,只有读,用 MyISAM 引擎能大大节省资源,速度也会快一些。
MYSQL主从复制配置
1 练习的场景
主从实战的数据库场景:
建议有三虚拟机:cdh1、 cdh2、 cdh3(cdh3可以不开启)。
cdh1 上的 user_db为主,cdh1 上的 user_db为从,仅仅开启这两个库的复制,其他的库如store,不开启主从复制。
有关学习环境的快速搭建,请参考本系列博客的准备一: 在window安装虚拟机集群 。
2 配置主数据库
登录主库
mysql ‐uroot ‐p123456
创建用于主从复制的账号
set global validate_password_policy=0;
set global validate_password_length=1;
create user db_sync identified by '123456';
创建库和表
mysql> CREATE DATABASE user_db DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
Query OK, 1 row affected (0.00 sec)
mysql> use user_db;
Database changed
mysql> create table t_user_0( id bigint , name varchar(40) );
Query OK, 0 rows affected (0.02 sec)
授权主备复制专用账号
GRANT REPLICATION SLAVE ON *.* TO 'db_sync'@'%' IDENTIFIED BY 'db_sync';
刷新权限
FLUSH PRIVILEGES;
修改 MySQL 配置文档 /etc/my.cnf,在 [mysqld] 段添加以下配置:
[mysqld]
#开启日志,启用二进制日志
log‐bin = mysql‐bin
#设置服务器标识ID,主从不能一致 ,每台服务器唯一
server‐id = 1
#设置需要同步的数据库
binlog‐do‐db=user_db
#屏蔽不需要同步的数据库
binlog‐ignore‐db=mysql
binlog‐ignore‐db=information_schema
binlog‐ignore‐db=performance_schema
binlog‐ignore‐db=dolphinscheduler
binlog‐ignore‐db=sys
binlog‐ignore‐db=store
参数说明:
log-bin
该参数只要配置就表示开启了MySQL的bin log日志功能,注意改参数的值是我们自定义的,我们自定义的值将作为bin log的名称的前缀信息哟,我们可以使用MySQL命令"show variables like '%log_bin%';"查看咱们的配置。server-id
该参数可以指定数据库服务器的唯一标识。在同一个复制组下的所有实例的server_id都必须是唯一的,而且取值必须是正整数,取值范围是1~(232)−1
可以通过show databases,查看所有的库,然后找出不需要同步的数据库
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| dolphinscheduler |
| mysql |
| performance_schema |
| store |
| sys |
+--------------------+
6 rows in set (0.01 sec)
完整配置如下:
[root@cdh1 ~]# cat /etc/my.cnf
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html
[mysqld]
log-bin=user-mysql-bin
server-id=1
binlog-do-db=user_db
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=dolphinscheduler
binlog-ignore-db=sys
binlog-ignore-db=store
skip-name-resolve
character_set_server=utf8
init_connect='SET NAMES utf8'
lower_case_table_names=1
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
3 配置从服务器
登录从库
mysql ‐uroot ‐p123456
创建用于主从复制的账号
set global validate_password_policy=0;
set global validate_password_length=1;
create user db_sync identified by '123456';
创建库和表
mysql> CREATE DATABASE user_db DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
Query OK, 1 row affected (0.00 sec)
mysql> use user_db;
Database changed
mysql> create table t_user_0( id bigint , name varchar(40) );
Query OK, 0 rows affected (0.02 sec)
授权主备复制专用账号
GRANT REPLICATION SLAVE ON *.* TO 'db_sync'@'%' IDENTIFIED BY '123456';
刷新权限
FLUSH PRIVILEGES;
修改 MySQL 配置文档 /etc/my.cnf,在 [mysqld] 段添加以下配置:
[mysqld]
log‐bin=mysql‐bin #开启日志,启用二进制日志
server‐id=2 #设置服务器标识ID,主从不能一致 ,每台服务器唯一
#设置需要同步的数据库
replicate_wild_do_table=user_db.%
#屏蔽系统库同步
replicate_wild_ignore_table=mysql.%
replicate_wild_ignore_table=information_schema.%
replicate_wild_ignore_table=performance_schema.%
replicate_wild_ignore_table=dolphinscheduler.%
replicate_wild_ignore_table=sys.%
replicate_wild_ignore_table=store.%
重启数据库
systemctl restart mysqld
完整的配置文件如下:
[root@cdh2 ~]# vim /etc/my.cnf
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html
[mysqld]
log-bin=user-mysql-bin
server-id=101
replicate_wild_do_table=user_db.%
replicate_wild_ignore_table=mysql.%
replicate_wild_ignore_table=information_schema.%
replicate_wild_ignore_table=performance_schema.%
replicate_wild_ignore_table=dolphinscheduler.%
replicate_wild_ignore_table=sys.%
replicate_wild_ignore_table=store.%
skip-name-resolve
character_set_server=utf8
init_connect='SET NAMES utf8'
lower_case_table_names=1
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
目录:分库分表 Sharding-JDBC从入门到精通
主题 | 链接地址 |
---|---|
准备1: 在window安装虚拟机集群 | 分布式 虚拟机 linux 环境制作 GO |
准备2:在虚拟机的各个节点有 mysql | centos mysql 笔记(内含vagrant mysql 镜像)GO |
分库分表 -Sharding-JDBC- 从入门到精通 1 | Sharding-JDBC 分库、分表(入门实战) GO |
分库分表 -Sharding-JDBC- 从入门到精通 2 | Sharding-JDBC 基础知识 GO |
分库分表 Sharding-JDBC 从入门到精通之 3 | 自定义主键、分布式雪花主键,原理与实战 GO |
分库分表 -Sharding-JDBC- 从入门到精通 4 | MYSQL集群主从复制,原理与实战 GO |
分库分表 Sharding-JDBC 从入门到精通之 5 | 读写分离 实战 GO |
分库分表 Sharding-JDBC 从入门到精通之 6 | Sharding-JDBC执行原理 GO |
分库分表 Sharding-JDBC 从入门到精通之源码 | git仓库地址GO |
MYSQL主从复制配置
1 练习的场景
主从实战的数据库场景:
建议有三虚拟机:cdh1、 cdh2、 cdh3(cdh3可以不开启)。
cdh1 上的 user_db为主,cdh1 上的 user_db为从,仅仅开启这两个库的复制,其他的库如store,不开启主从复制。
有关学习环境的快速搭建,请参考本系列博客的准备一: 在window安装虚拟机集群 。
2 配置主数据库
登录主库
mysql ‐uroot ‐p123456
创建用于主从复制的账号
set global validate_password_policy=0;
set global validate_password_length=1;
create user db_sync identified by '123456';
创建库和表
mysql> CREATE DATABASE user_db DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
Query OK, 1 row affected (0.00 sec)
mysql> use user_db;
Database changed
mysql> create table t_user_0( id bigint , name varchar(40) );
Query OK, 0 rows affected (0.02 sec)
授权主备复制专用账号
GRANT REPLICATION SLAVE ON *.* TO 'db_sync'@'%' IDENTIFIED BY 'db_sync';
刷新权限
FLUSH PRIVILEGES;
修改 MySQL 配置文档 /etc/my.cnf,在 [mysqld] 段添加以下配置:
[mysqld]
#开启日志,启用二进制日志
log‐bin = mysql‐bin
#设置服务器标识ID,主从不能一致 ,每台服务器唯一
server‐id = 1
#设置需要同步的数据库
binlog‐do‐db=user_db
#屏蔽不需要同步的数据库
binlog‐ignore‐db=mysql
binlog‐ignore‐db=information_schema
binlog‐ignore‐db=performance_schema
binlog‐ignore‐db=dolphinscheduler
binlog‐ignore‐db=sys
binlog‐ignore‐db=store
参数说明:
log-bin
该参数只要配置就表示开启了MySQL的bin log日志功能,注意改参数的值是我们自定义的,我们自定义的值将作为bin log的名称的前缀信息哟,我们可以使用MySQL命令"show variables like '%log_bin%';"查看咱们的配置。server-id
该参数可以指定数据库服务器的唯一标识。在同一个复制组下的所有实例的server_id都必须是唯一的,而且取值必须是正整数,取值范围是1~(232)−1
可以通过show databases,查看所有的库,然后找出不需要同步的数据库
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| dolphinscheduler |
| mysql |
| performance_schema |
| store |
| sys |
+--------------------+
6 rows in set (0.01 sec)
完整配置如下:
[root@cdh1 ~]# cat /etc/my.cnf
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html
[mysqld]
log-bin=user-mysql-bin
server-id=1
binlog-do-db=user_db
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=dolphinscheduler
binlog-ignore-db=sys
binlog-ignore-db=store
skip-name-resolve
character_set_server=utf8
init_connect='SET NAMES utf8'
lower_case_table_names=1
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
3 配置从服务器
登录从库
mysql ‐uroot ‐p123456
创建用于主从复制的账号
set global validate_password_policy=0;
set global validate_password_length=1;
create user db_sync identified by '123456';
创建库和表
mysql> CREATE DATABASE user_db DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
Query OK, 1 row affected (0.00 sec)
mysql> use user_db;
Database changed
mysql> create table t_user_0( id bigint , name varchar(40) );
Query OK, 0 rows affected (0.02 sec)
授权主备复制专用账号
GRANT REPLICATION SLAVE ON *.* TO 'db_sync'@'%' IDENTIFIED BY '123456';
刷新权限
FLUSH PRIVILEGES;
修改 MySQL 配置文档 /etc/my.cnf,在 [mysqld] 段添加以下配置:
[mysqld]
log‐bin=mysql‐bin #开启日志,启用二进制日志
server‐id=2 #设置服务器标识ID,主从不能一致 ,每台服务器唯一
#设置需要同步的数据库
replicate_wild_do_table=user_db.%
#屏蔽系统库同步
replicate_wild_ignore_table=mysql.%
replicate_wild_ignore_table=information_schema.%
replicate_wild_ignore_table=performance_schema.%
replicate_wild_ignore_table=dolphinscheduler.%
replicate_wild_ignore_table=sys.%
replicate_wild_ignore_table=store.%
重启数据库
systemctl restart mysqld
完整的配置文件如下:
[root@cdh2 ~]# vim /etc/my.cnf
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html
[mysqld]
log-bin=user-mysql-bin
server-id=101
replicate_wild_do_table=user_db.%
replicate_wild_ignore_table=mysql.%
replicate_wild_ignore_table=information_schema.%
replicate_wild_ignore_table=performance_schema.%
replicate_wild_ignore_table=dolphinscheduler.%
replicate_wild_ignore_table=sys.%
replicate_wild_ignore_table=store.%
skip-name-resolve
character_set_server=utf8
init_connect='SET NAMES utf8'
lower_case_table_names=1
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
4 主从复制的配置
4.1 设置主库
首先连接 master db,为从库的账号授予复制的权利
GRANT REPLICATION SLAVE ON *.* TO 'db_sync'@'%' IDENTIFIED BY '123456';
如果权限不够,就执行一下下面的两句:
set global validate_password_policy=0;
set global validate_password_length=1;
刷新权限
FLUSH PRIVILEGES;
在主库查看同步的起点, 记录下文件名以及起点 位置
show master status;
查看数据库状态:
记录 File 的值( user-mysql-bin.000001 )和 Position 的值(154),等会配置 slave 服务器的时候要用。
4.2设置从库
接下来在 slave db上,配置主从复制:
先停止同步
STOP SLAVE;
修改从库的master配置,指向到主库,配置过程中,需要使用上一步记录的文件名以及位点
mysql>change master to
master_host='cdh1',
master_user='db_sync',
master_log_file='user-mysql-bin.000001',
master_log_pos=154,
master_port=3306,
master_password='123456';
Query OK, 0 rows affected, 2 warnings (0.03 sec)
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
解释下配置参数
master_host='x.x.x.x' // 这里填 master 主机 ip
master_log_file='user-mysql-bin.000001', // 这里填写 File 的值
master_log_pos=154,// 这里填写 Position 的值。
启动同步
START SLAVE;
查看同步
show slave status\G;
结果如下:
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: cdh1
Master_User: db_sync
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: user-mysql-bin.000002
Read_Master_Log_Pos: 154
Relay_Log_File: cdh2-relay-bin.000004
Relay_Log_Pos: 377
Relay_Master_Log_File: user-mysql-bin.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: user_db.%
Replicate_Wild_Ignore_Table: mysql.%,information_schema.%,performance_schema.%,dolphinscheduler.%,sys.%,store.%
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 154
Relay_Log_Space: 2531
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: 1
Master_UUID: fb8d483c-47eb-11eb-ba17-0800276c3e95
Master_Info_File: /var/lib/mysql/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:
1 row in set (0.00 sec)
查看Slave_IO_Runing和Slave_SQL_Runing字段值都为Yes,表示同步配置成功。如果不为Yes,请排
查相关异常。
如果不小心配置错, 输入 mysql> stop slave; 然后重新录入一遍就可以了。
5 问题:
问题1: 由于是克隆的虚拟机,所以mysql的uuid相同,报错如下:
The slave I/O thread stops because master and slave have equal MySQL server UUID
原因:主从复制的mysql实例的uuid不能相同。
修改方法:在从库上,从my.cnf找到data目录,然后定位到auto.cnf目录,找到 auto.cnf文件,进行uuid的调整。
具体如下:
$ vim /var/lib/mysql/auto.cnf
[auto]
server-uuid=fb8d483c-47eb-11eb-ba17-0800276c3e96
修改之后:
[root@cdh2 ~]# cat /var/lib/mysql/auto.cnf
[auto]
server-uuid=fb8d483c-47eb-11eb-ba17-0800276c3e96
最终,确保两个mysql 实例的uuid不同。
然后,重启改动过的实例。
6 主从复制测试
1 将主库的t_user_0表复制一份t_user_0_copy1,稍等一会,刷新从库,发现从库也有了一个t_user_0_copy1表,表明从库复制了主库的t_user_0_copy1表。
2 修改主库的t_user_0_copy1,名称为t_user_1,大约过去10s,刷新从库,从库的t_user_0_copy1名称改为t_user_1
Note: 这里只是演示,所以把数据表也同步过来了。一般情况下数据表是不同步的,先各自在 master 和 salve 创建好。 因为一般来说 master 和 slave 的表的存储引擎是不一样的,master 一般用的是 InnoDB,因为它要写数据比较多。 而 slave 表一般用的是 MyISAM 引擎,因为它是没有写数据操作,只有读,用 MyISAM 引擎能大大节省资源,速度也会快一些。
4 主从复制的配置
4.1 设置主库
首先连接 master db,为从库的账号授予复制的权利
GRANT REPLICATION SLAVE ON *.* TO 'db_sync'@'%' IDENTIFIED BY '123456';
如果权限不够,就执行一下下面的两句:
set global validate_password_policy=0;
set global validate_password_length=1;
刷新权限
FLUSH PRIVILEGES;
在主库查看同步的起点, 记录下文件名以及起点 位置
show master status;
查看数据库状态:
记录 File 的值( user-mysql-bin.000001 )和 Position 的值(154),等会配置 slave 服务器的时候要用。
4.2设置从库
接下来在 slave db上,配置主从复制:
先停止同步
STOP SLAVE;
修改从库的master配置,指向到主库,配置过程中,需要使用上一步记录的文件名以及位点
mysql>change master to
master_host='cdh1',
master_user='db_sync',
master_log_file='user-mysql-bin.000001',
master_log_pos=154,
master_port=3306,
master_password='123456';
Query OK, 0 rows affected, 2 warnings (0.03 sec)
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
解释下配置参数
master_host='x.x.x.x' // 这里填 master 主机 ip
master_log_file='user-mysql-bin.000001', // 这里填写 File 的值
master_log_pos=154,// 这里填写 Position 的值。
启动同步
START SLAVE;
查看同步
show slave status\G;
结果如下:
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: cdh1
Master_User: db_sync
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: user-mysql-bin.000002
Read_Master_Log_Pos: 154
Relay_Log_File: cdh2-relay-bin.000004
Relay_Log_Pos: 377
Relay_Master_Log_File: user-mysql-bin.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: user_db.%
Replicate_Wild_Ignore_Table: mysql.%,information_schema.%,performance_schema.%,dolphinscheduler.%,sys.%,store.%
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 154
Relay_Log_Space: 2531
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: 1
Master_UUID: fb8d483c-47eb-11eb-ba17-0800276c3e95
Master_Info_File: /var/lib/mysql/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:
1 row in set (0.00 sec)
查看Slave_IO_Runing和Slave_SQL_Runing字段值都为Yes,表示同步配置成功。如果不为Yes,请排
查相关异常。
如果不小心配置错, 输入 mysql> stop slave; 然后重新录入一遍就可以了。
5 问题:
问题1: 由于是克隆的虚拟机,所以mysql的uuid相同,报错如下:
The slave I/O thread stops because master and slave have equal MySQL server UUID
原因:主从复制的mysql实例的uuid不能相同。
修改方法:在从库上,从my.cnf找到data目录,然后定位到auto.cnf目录,找到 auto.cnf文件,进行uuid的调整。
具体如下:
$ vim /var/lib/mysql/auto.cnf
[auto]
server-uuid=fb8d483c-47eb-11eb-ba17-0800276c3e96
修改之后:
[root@cdh2 ~]# cat /var/lib/mysql/auto.cnf
[auto]
server-uuid=fb8d483c-47eb-11eb-ba17-0800276c3e96
最终,确保两个mysql 实例的uuid不同。
然后,重启改动过的实例。
6 主从复制测试
1 将主库的t_user_0表复制一份t_user_0_copy1,稍等一会,刷新从库,发现从库也有了一个t_user_0_copy1表,表明从库复制了主库的t_user_0_copy1表。
2 修改主库的t_user_0_copy1,名称为t_user_1,大约过去10s,刷新从库,从库的t_user_0_copy1名称改为t_user_1
Note: 这里只是演示,所以把数据表也同步过来了。一般情况下数据表是不同步的,先各自在 master 和 salve 创建好。 因为一般来说 master 和 slave 的表的存储引擎是不一样的,master 一般用的是 InnoDB,因为它要写数据比较多。 而 slave 表一般用的是 MyISAM 引擎,因为它是没有写数据操作,只有读,用 MyISAM 引擎能大大节省资源,速度也会快一些。
4 主从复制的配置
4.1 设置主库
首先连接 master db,为从库的账号授予复制的权利
GRANT REPLICATION SLAVE ON *.* TO 'db_sync'@'%' IDENTIFIED BY '123456';
如果权限不够,就执行一下下面的两句:
set global validate_password_policy=0;
set global validate_password_length=1;
刷新权限
FLUSH PRIVILEGES;
在主库查看同步的起点, 记录下文件名以及起点 位置
show master status;
查看数据库状态:
记录 File 的值( user-mysql-bin.000001 )和 Position 的值(154),等会配置 slave 服务器的时候要用。
4.2设置从库
接下来在 slave db上,配置主从复制:
先停止同步
STOP SLAVE;
修改从库的master配置,指向到主库,配置过程中,需要使用上一步记录的文件名以及位点
mysql>change master to
master_host='cdh1',
master_user='db_sync',
master_log_file='user-mysql-bin.000001',
master_log_pos=154,
master_port=3306,
master_password='123456';
Query OK, 0 rows affected, 2 warnings (0.03 sec)
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
解释下配置参数
master_host='x.x.x.x' // 这里填 master 主机 ip
master_log_file='user-mysql-bin.000001', // 这里填写 File 的值
master_log_pos=154,// 这里填写 Position 的值。
启动同步
START SLAVE;
查看同步
show slave status\G;
结果如下:
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: cdh1
Master_User: db_sync
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: user-mysql-bin.000002
Read_Master_Log_Pos: 154
Relay_Log_File: cdh2-relay-bin.000004
Relay_Log_Pos: 377
Relay_Master_Log_File: user-mysql-bin.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: user_db.%
Replicate_Wild_Ignore_Table: mysql.%,information_schema.%,performance_schema.%,dolphinscheduler.%,sys.%,store.%
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 154
Relay_Log_Space: 2531
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: 1
Master_UUID: fb8d483c-47eb-11eb-ba17-0800276c3e95
Master_Info_File: /var/lib/mysql/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:
1 row in set (0.00 sec)
查看Slave_IO_Runing和Slave_SQL_Runing字段值都为Yes,表示同步配置成功。如果不为Yes,请排
查相关异常。
如果不小心配置错, 输入 mysql> stop slave; 然后重新录入一遍就可以了。
5 问题:
问题1: 由于是克隆的虚拟机,所以mysql的uuid相同,报错如下:
The slave I/O thread stops because master and slave have equal MySQL server UUID
原因:主从复制的mysql实例的uuid不能相同。
修改方法:在从库上,从my.cnf找到data目录,然后定位到auto.cnf目录,找到 auto.cnf文件,进行uuid的调整。
具体如下:
$ vim /var/lib/mysql/auto.cnf
[auto]
server-uuid=fb8d483c-47eb-11eb-ba17-0800276c3e96
修改之后:
[root@cdh2 ~]# cat /var/lib/mysql/auto.cnf
[auto]
server-uuid=fb8d483c-47eb-11eb-ba17-0800276c3e96
最终,确保两个mysql 实例的uuid不同。
然后,重启改动过的实例。
6 主从复制测试
1 将主库的t_user_0表复制一份t_user_0_copy1,稍等一会,刷新从库,发现从库也有了一个t_user_0_copy1表,表明从库复制了主库的t_user_0_copy1表。
2 修改主库的t_user_0_copy1,名称为t_user_1,大约过去10s,刷新从库,从库的t_user_0_copy1名称改为t_user_1
Note: 这里只是演示,所以把数据表也同步过来了。一般情况下数据表是不同步的,先各自在 master 和 salve 创建好。 因为一般来说 master 和 slave 的表的存储引擎是不一样的,master 一般用的是 InnoDB,因为它要写数据比较多。 而 slave 表一般用的是 MyISAM 引擎,因为它是没有写数据操作,只有读,用 MyISAM 引擎能大大节省资源,速度也会快一些。