测试代码:https://gitee.com/ylbuu/sharding-jdbc
这里我使用两台虚拟机分别安装MySQL来测试学习;
安装MySQL
资源连接:https://repo.mysql.com/yum/mysql-5.7-community/el/7/x86_64/
配置MySQL扩展源
rpm -ivh https://repo.mysql.com/yum/mysql-5.7-community/el/7/x86_64/mysql57-community-release-el7-10.noarch.rpm
yum安装MySQL
yum install mysql-community-server -y
启动MySQL,加入开启自启
systemctl start mysqld
systemctl stop mysqld
systemctl enable mysqld
使用初始密码登录mysql
## 获取初始密码
grep "password" /var/log/mysqld.log
mysqld -uroot -p
## 一步到位
mysqld -uroot -p$(awk '/temporary password/{print $NF}' /var/log/mysqld.log)
修改初始密码
# 修改密码级别0,1,2;0最低。
mysql > set global validate_password_policy=0;
mysql > set password for root@localhost = password('1234');
or
mysql > alter user 'root'@'localhost' identified by '1234';
# 查看密码策略要求
mysql > SHOW VARIABLES LIKE 'validate_password%';
远程登录授权(可视化工具)
mysql > grant all on *.* to root@'%' identified by '1234';
# 刷新
mysql > flush privileges;
MySql主从复制
主从复制原理
原理:
主服务器上面的任何修改都会通过自己的I/O thread保存在二进制日志Binary log里面;
- 从服务器上面也启动一个I/O thread,通过配置好的用户名和密码,连接到主服务器上面请求读取二进制日志,然后把读取到的二进制日志写入本地一个叫Relay log(中继日志)里面;
- 从服务器上同时开启一个I/O thread 定时检查Relay log,如果发现由更新立即把更新的内容在本机上执行一遍;每个从服务器都会收到主服务器二进制日志的全部内容的副本;
- 从服务器设备负责决定应该执行二进制日志中的哪些语句;
配置
Master节点配置
etc/my.conf
[mysqld]
## 同一局域网内注意要唯一
server.id=100
## 开启二进制日志功能,可以随便取
log-bin=mysql-bin
## 复制过滤,不需要备份的数据库,不输出
binlog-ignore-db=mysql
## 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M
## 主从复制的格式(mixed,statement,row)
binlog_format=mixed
重启mysql服务
systemctl restart mysqld
Slave节点配置
etc/my.conf
[mysqld]
## 同一局域网内注意要唯一
server.id=101
## 开启二进制日志功能,可以随便取
log-bin=mysql-slave-bin
## relay_log配置
relay_log=mysql-relay-bin
## 复制过滤,不需要备份的数据库,不输出
binlog-ignore-db=mysql
## 如果需要同步函数或者存储过程
log_bin_trust_function_creators=true
## 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M
## 主从复制的格式(mixed,statement,row)
binlog_format=mixed
## 跳过主从复制中遇到的所有错误或指定的错误,避免slave复制中断
## 如:1062指 主键重复错误,1032指主从数据库数据不一致
slave_skip_errors=1062
重启MySQL服务
在master主服务器上授权slave服务器可以同步权限
## 授予从服务器可以同步主服务器服务
mysql > grant replication slave,replication client on *.* to 'root'@'从服务器ip' identified by '从服务器密码';
## 刷新
mysql > flush privileges;
## 查看MySQL现在有哪些用户及对应的ip权限
mysql > select user,host from mysql.user;
查询master服务的binlog文件名和位置
show master status;
# 查看binlog是否开启
mysql > show variables like '%log_bin%';
slave从服务器关联master节点
mysql > change master to master_host='master服务器ip',master_user='root',master_password='主服务器密码',master_port=3306,master_log_file='mysql-bin.000001',master_log_pos=二进制位置Position;
其中
master_log_file
和master_log_pos
需要实时查看master主服务器show master status;
的值。
在slave节点上查看主从同步状态
# 启动主从复制
mysql > start slave;
# 查看状态
mysql > show slave status\G;
#停止复制
mysql > stop slave;
连接错误记录:
服务器因错误停止的恢复方式–Slave_SQL_Running:No
先停止复制
stop slave;
set global sql_slave_skip_counter=1;
start slave;
show slave status\G;
查看主服务器master信息
show master status;
重新绑定
stop slave;
change master to master_host='master服务器 ip',master_user='root',master_password='1234',master_port=3306,master_log_file='mysql-bin.000001',master_log_pos=二进制位置Position;
测试
主库创建一个test库;
查看从库;
ShardingJdbc实现读写分离
pom依赖
<properties