Mysql数据库的主从、读写

一、Mysql的日志

MySQL的配置文件:/etc/my.cnf

查看MySQL的数据目录:show variables like '%datadir%';

1.1、错误日志(error log)

记录mysql服务的启动、服务异常,用于解决服务器故障;
查看日志:show variables like '%log_error%';

1.2、二进制日志(bin log)

默认开启,记录更改数据的语句,用于数据同步和灾难时人工恢复数据;
查看日志:show variables like '%log_bin%';
查看二进制日志格式:show variables like '%binlog_format%';
查看二进制日志过期时间:show variables like '%binlog_expire_logs_seconds%';

1.3、一般查询日志(general log)

默认关闭,记录客户端连接发送给数据库的操作指令
查看日志:show variables like '%general%';

1.4、慢查询日志

记录执行时间超过long_query_time(默认10s)查询

默认不记录不使用索引进行查找的查询。

可用log_slow_admin_statements 和 更改此行为 log_queries_not_using_indexes。

#记录执行较慢的管理语句

log_slow_admin_statements =1

#记录执行较慢的未使用索引的语句

log_queries_not_using_indexes = 1
查看日志:show variables like 'slow_query_log';

1.5、中继日志(relay log)

主从复制原理

从库上日志,从库读取主库的二进制日志后写入中继日志,通过中继日志执行Sql。

查看日志:show variables like '%relay%';

1.6、事务日志(redo log和undo log)

重做日志(redo log)

在数据变更前先写入redo log。
撤销日志(undo log)

当一些变更执行到一半无法完成时,可根据撤销日志恢复到变更前。

二、Mysql的主从复制

主库内部有一个线程负责与从库的长连接。

2.1、主从复制原理

1.主库bin log二进制文件纪录所有增删改SQL语句(binlog线程)。

2.从库把主数据库的bin log文件的SQL 复制到自己的中继日志 relay log(io线程)。

3.从库的relay log重做日志文件,再执行一次这些sql语句(Sql执行线程)。

2.2、复制类型

1.全同步复制

主库执行完一个事务之后,要所有从库也都执行完该事务,才返回处理结果给客户端,性能较低。

2.异步复制

主库提交事物后,发送binlog日志给从库,从库收到日志后不等从库同步完成事务,主库就将结果返回给客户端。性能高,数据一致性最差。

3.半同步复制

主库提交事物后等待至少有一个从库收到了Binlog,并写入到中继日志,再返回给客户端,提高了数据的一致性。

参数:rpl_semi_sync_master_wait_for_slave_count,可对需要响应的从库数量进行设置,默认为1。

4.增强半同步复制

mysql 5.7.2后的版本对半同步复制的改进,原理一样,主要解决幻读问题。

主库配置了参数 rpl_semi_sync_master_wait_point = AFTER_SYNC 后,

主库在存储引擎提交事务前,须先收到从库数据同步完成的确认信息后,才提交事务,来解决幻读问题。

2.3、bin log日志的格式

语句级别的复制(statement-based replication,SBR): binlog记录SQL原文,主库和从库选的索引不一致,会导致数据不一致。
行级别的复制(row-based replication,RBR): binlog日志记录SQL,还记录删除的主键ID信息、删除的行数,会很占空间。
**混合复制(mixed-based replication,MBR):**row和statement格式混合使用,当数据可能不一致时,用row格式,否则用statement格式。

三、MySQL8.0主从部署配置

主机名 ip 角色
c7-lab1 10.10.104.51
c7-lab2 10.10.104.52

3.1、安装两台MySQL数据库

3.1.1、下载

官网下载rpm bundle包上传到centos系统上。

官网:https://dev.mysql.com/downloads/mysql

cs 复制代码
# 服务器上直接下载:
wget https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.33-1.el7.x86_64.rpm-bundle.tar 

3.1.2、解压bundle包

cpp 复制代码
tar xvf mysql-8.0.33-1.el7.x86_64.rpm-bundle.tar

3.1.3、卸载mariadb

cpp 复制代码
rpm -qa | grep mariadb
rpm -e --nodeps mariadb-libs-*

3.1.4、安装MySQL

MySQL的rpm包

cpp 复制代码
rpm -ivh mysql-community-common-8.0.33-1.el7.x86_64.rpm mysql-community-client-plugins-8.0.33-1.el7.x86_64.rpm mysql-community-libs-8.0.33-1.el7.x86_64.rpm mysql-community-client-8.0.33-1.el7.x86_64.rpm mysql-community-icu-data-files-8.0.33-1.el7.x86_64.rpm mysql-community-server-8.0.33-1.el7.x86_64.rpm

3.1.5、初始化MySQL并启动

cs 复制代码
#初始化
mysqld --initialize --console
#授权mysql用户
chown -R mysql:mysql /var/lib/mysql/
启动服务
systemctl start mysqld

systemctl enable mysqld
#查看初始化密码
cat /var/log/mysqld.log  | grep localhost

3.1.6、登录MySql、配置用户

cs 复制代码
mysql -u root -p  #带上初始化的密码

#修改密码,开启远程
#修改登录密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'Csdn@123';
#切换到mysql数据库
use mysql;.
#开启数据库远程管理
update user set Host='%' where User='root';
flush privileges;

登录MySQL和配置用户
修改密码,开启远程

3.2、主从配置

3.2.1、在主服务器(c7-lab1)上修改配置文件(my.cnf或my.ini)新增下面参数:

cs 复制代码
cat  >> /etc/my.cnf <<EOF 
#服务器 id,随意,但要唯一
server-id = 1  
#二进制文件存放路径
log-bin = mysql-bin 
#参数用于排除自带的数据库。  
binlog-ignore-db = mysql 
binlog-ignore-db = information_schema
binlog-ignore-db = performance_schema
#二进制日志格式,建议使用ROW格式以获得更好的兼容性和可靠性。
binlog-format = ROW 

EOF
	
#重启从服务以使配置更改生效。
systemctl restart mysqld

3.2.2、在主服务器的数据库中创建用于复制的账户并授予相应的权限

cs 复制代码
#登录MySQL
mysql -uroot -pCsdn@123

use mysql;
#创建用户
CREATE USER 'db_sync'@'%' IDENTIFIED BY 'Csdn@123';
#授权账号复制权限
GRANT REPLICATION SLAVE ON *.* TO 'db_sync'@'%';
#刷新配置
FLUSH PRIVILEGES;

3.2.3、在主服务器上执行以下命令获取当前二进制日志文件的名称和位置

cs 复制代码
SHOW MASTER STATUS;

记下输出中的 File 和 Position 值,后续在从服务器上使用。

3.2.4、在从服务器(c7-lab2)上修改配置文件(my.cnf或my.ini),找到并编辑以下参数:

cs 复制代码
cat >>/etc/my.cnf <<EOF

server-id = 2
#中继日志文件的名称,用于从主服务器接收二进制日志事件。
relay-log = mysql-relay-bin 
#从服务器的二进制日志文件的名称。
log_bin = mysql-bin 
#不同步相关的库
replicate-ignore-db = mysql 
replicate-ignore-db = information_schema
replicate-ignore-db = performance_schema

EOF

#重启MySQL服务
systemctl restart mysqld

3.2.5、登录从服务器(c7-lab2)MySQL上更据主服务器建立的账号和show master status;显示的内容,修改以下命令配置主从复制:(根据第3.2.3上的内容修改)

cs 复制代码
STOP SLAVE;
CHANGE MASTER TO
MASTER_HOST = '10.10.104.51',
MASTER_USER = 'db_sync',
MASTER_PASSWORD = 'Csdn@123',
#主服务器数据库上的file值(不能有空格)
MASTER_LOG_FILE = 'mysql-bin.000001',
#主服务器数据库的Position值
MASTER_LOG_POS = 157,
get_master_public_key=1;

3.2.6、在在从服务器启动同步并查看状态

cs 复制代码
#开启同步
start slave;
#查看同步状态
SHOW SLAVE STATUS\G;

Slave_IO_Running 、Slave_SQL_Running 两个字段的值都是 Yes,表示主从复制已经成功配置。

相关推荐
兩尛1 小时前
订单状态定时处理、来单提醒和客户催单(day10)
java·前端·数据库
web2u1 小时前
MySQL 中如何进行 SQL 调优?
java·数据库·后端·sql·mysql·缓存
Elastic 中国社区官方博客2 小时前
使用 Elasticsearch 导航检索增强生成图表
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
小金的学习笔记2 小时前
RedisTemplate和Redisson的使用和区别
数据库·redis·缓存
新知图书3 小时前
MySQL用户授权、收回权限与查看权限
数据库·mysql·安全
文城5213 小时前
Mysql存储过程(学习自用)
数据库·学习·mysql
沉默的煎蛋3 小时前
MyBatis 注解开发详解
java·数据库·mysql·算法·mybatis
呼啦啦啦啦啦啦啦啦3 小时前
【Redis】事务
数据库·redis·缓存
HaoHao_0103 小时前
AWS Serverless Application Repository
服务器·数据库·云计算·aws·云服务器
C语言扫地僧3 小时前
MySQL 事务及MVCC机制详解
数据库·mysql