5.3 MySql实战
5.3.1 数据分布
5.3.2 负载均衡
5.3.3 备份与恢复
1.mysql日志管理
mysql日志默认保存位置为/usr/local/mysql/data,
mysql日志配置文件是/etc/my.cnf
错误日志:记录mysql启动停止运行时所有的错误信息
vim /etc/my.cnf
log-error=/home/mysql/error.log ##错误日志的保存路径
通用查询日志:记录mysql所有连接和语句,默认关闭
general_log=ON
general_log_file=/usr/local/mysql/data/mysql_general.log ##通用日志路径
二进制日志:记录mysql启动停止运行时发送的错误信息
log-bin=mysql-bin 或者log_bin=mysql-bin
文件默认存储在/usr/local/mysql/data中
慢查询日志:记录执行时间超过logng_query_time的语句,以便针对这些语句进行优化
slow_query_log=ON
slow_query_log_file=/usr/local/mysql/data/mysql_slow_query.log
slow_query_time=5
2.查看日志状态
查看通用日志是否开启:show variables like 'general%';
查看二进制是否开启:show variables like 'log_bin%';
查看慢查询日志是否开启:show variables like '%slow%';
查询慢查询时间设置:show variables like 'long_query_time';
3.mysql的备份与恢复
3.1 分类
物理和逻辑角度,可分为物理备份和逻辑备份
物理备份方法
冷备份(脱机备份):数据库关闭状态下进行的备份
热备份(联机备份):数据库运行状态,依赖数据库日志文件
温备份:数据库锁定表格,不可写可读的状态下进行备份
逻辑备份方法:对数据库逻辑组件(如:数据库表对象),即以SQL语句形式,将库、表结构、表数据保存下来
完全备份(全量备份):每次对数据库进行完整备份
差异备份:备份自从上次完全备份后修改的文件
增量备份:只有在上次完全备份或增量备份后修改的文件才会备份
从备份策略角度, 可分为完全备份、差异备份、增量备份
4.常见备份方法
4.1 物理冷备(完全物理备份)
备份时数据库处于关闭状态,直接copy数据库文件
此方式备份速度快,恢复也最简单
4.2 专用备份工具mydump和mysqlhotcopy(完全逻辑备份)
4.3 第三方工具备份,例如Percona XtraBackup(阿里云的工具:dts,支持热迁移)
5.mysql完全备份与恢复
5.1 完全物理冷备份操作步骤
systemctl stop mysqld
yum -y install xz
## 压缩备份
cd /usr/local/mysql
tar Jcvf /opt/mysql_all_$(date+%F).tar.gz data/
##备份恢复
tar Jxvf /opt/mysql_all_2024_04-16.tar.gz -C ./
systemctl restart mysqld.service
mysql -u root -p
show database
5.2 使用mysqldump进行完全逻辑备份
完全备份一个或多个完整的库(包括其中所有的表)
mkdir /opt/mysql_bak
语法:mysqldump -u root -p [密码] --database 库名1 库名2 > /备份路径/备份文件.sql
示例:mysqldumo -u root -p a123 --database school ucenter > /opt/mysql_bak/school ucenter.sql
完全备份mysql服务器中所有的库
语法:mysqldump -u root -p [密码] --all-database >/备份路径/备份文件.sql
示例:mysqldump -u root -p a123 --all-database > /opt/mysql_bak/all.sql
完全备份指定库的指定表
语法:mysqldump -u roor -p [密码] [库名] [表名1] [表名2] > /备份路径/备份文件.sql
示例:mysqldump -u root -p a123 school class1> /opt/mysql_bak/school_class1.sql
查看备份文件命令
cd /opt/mysql_bak
cat 备份文件.sql | grep -v "^--" |grep -v "^/" |grep -v "^$"
5.3 备份文件恢复
恢复某一个库语法命令:mysql -u [用户名] -p [密码] < /备份路径/备份文件.sql
恢复某一个库示例:mysql -u root -p a123 < /opt/mysql_bak/school.sql
恢复某一个库下的单表的语法命令:mysql -u [用户名] -p [密码] [库名] [表名] < /备份路径/备份文件.sql
恢复某一个库下的单表示例:mysql -u root -p a123 school class < /opt/mysql_bak/school_class1.sql
5.4 每周对数据库或表进行完全逻辑备份(非自动执行,每周手动进行调用)
对指定表备份命令:mysql -u [用户] -p [密码] 库名 表名 > /备份路径/备份文件_$(date+%F).sql
对指定表备份示例:mysql -u root -p a123 school class1 > /opt/mysql_bak/school_class_$(date+%F).sql
对指定库备份命令:mysql -u [用户] -p [密码] --all-database [库名] > /备份路径/备份文件_$(date+%F).sql
对指定库备份示例:mysql -u root -p a123 --add-database school > /opt/mysql_bak/school_$(date+%F).sql
6.mysql增量备份与恢复(自上一次备份后增加/变化的文件内容)
6.1 特点
没有重复数据,备份量不大,备份时间短
6.2 开启增量备份前提设置
vim /etc/my.cnf
log-bin=mysql-bin ##开启二进制日志
binlog_format=MIXED ##指定二进制记录格式
systemctl restart mysqld ##重启mysql
6.3 每天进行增量备份操作,生成新的二进制文件(例如:mysql-bin:000002)
命令
cd /usr/local/mysql/data
mysqladmin -u [用户名] -p [密码] flush logs
示例
mysqladmin -u root -p a123 flush logs
6.4 查看二进制文件内容
命令
cp /二进制文件所处路径/二进制文件 /拷贝路径/
mysqlbinlog --no-defaults --base64-output=decode-rows -v /拷贝路径/二进制文件所处路径/二进制文件
示例:cp /usr/local/mysql/data/mysql-bin.000004 /opt/mysql_all_$
mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000004
6.5 增量恢复二进制文件
命令:mysqlbinlog --no-defaults /备份路径/备份文件 | mysql -u [用户名] -p [密码]
示例:mysqlbinlog --no-defaults /opt/mysql_bak/mysql-bin.000004 | mysql -u root -p a123
执行完毕执行查询:mysql -u root -p a123 -e 'select * from school.class1';
参考资料:https://blog.csdn.net/weixin_53246927/article/details/125274452
5.3.4 故障切换
定义:为了高可用性质,主数据库服务器宕机后将备用服务器作为主服务器数据库
切换方法:手动切换和自动切换
切换方案:
增加中间件或使用keepalive进行切换(使用MHA高可用配置故障切换) todo
jdbc方式,mysql驱动包mysql-connection-java-xxx.jar已经具备自动切换数据库的功能,前提是主库和从库的数据一致性(主从赋值)
设置jdbc-url即可,例如:jdbc:mysql://192.168.0.1:3306,192.168.0.2:3306/mydb
参考资料:https://blog.csdn.net/xuziwen127/article/details/129533129
https://blog.csdn.net/G_D0120/article/details/137131522
5.3.5 主从复制
1.mysql主从复制介绍
mysql数据库默认支持主从复制,无需借助第三方工具,只需要在数据库简单配置即可
mysql主从复制是异步过程,底层基于mysql自带的二进制日志功能。大致操作是一台或多台数据库从另一台数据库进行日志的复制,然后解析日志并应用自身,最终实现从库和主库数据保持一致。
二进制日志(BINLOG)记录了所有的DDL(数据定义语言)和DML(数据操纵语言)语句,不包括查询语句
2.主从复制实际操作
2.1 准备2台都安装mysql的服务器
2.2 两台服务器防火墙开放3306端口
firewall-cmd --zone=public --add-port=3306/tcp --permanent 放开3306端口
firewall-cmd --zone=public --list-ports 查看防火墙开放端口列表
2.3 将2台服务器的数据库启动 systemctl start mysqld
mysql -u username -p password 登录Mysql 看能否成功启动
2.4 主库修改mysql配置文件/etc/my.cnf
最后添加以下配置:
log-bin=mysql-bin #必须,启用二进制日志
server-id=200 #必须,服务器唯一ID
2.5 重启mysql 服务
systemctl restart mysqld
2.6 创建数据同步用户并授权
登录Mysql,执行以下创建用户并授权的指令
GRANT REPLICATION SLAVE ON *.* to 'xiaoming'@'%' identified by 'Root@123456';
注意:上述命令执行创建用户名为xiaoming,密码为Root@123456,并给xiaoming用户授予 REPLICATION SLAVE权限。
tips:查看Mysql密码复杂程度命令:show variables like 'validate_password_policy';
mysql 5.7 默认密码校验策略登记为MEDIUM,该登记要求组成必须包含:数字、小写字符、大写字符、特殊符号;长度至少8位
2.7 登录Mysql数据库,查看mysql同步状态
show master status;
2.8 从库配置:修改/etc/my.cnf配置文件
最后添加 server-id=201 #必须 服务器唯一ID
2.9 重启从库Mysql
systemctl restart mysqld
2.10 登录Mysql从库,设置主库位置及同步位置
change master to master_host='192.168.200.200',master_user='xiaoming',master_password='Root@123456',master_log_file='mysql-bin.000001',master_log_pos=154;
start slave;
参数说明:
A. master_host : 主库的IP地址
B. master_user : 访问主库进行主从复制的用户名(上面在主库创建的)
C. master_password : 访问主库进行主从复制的用户名对应的密码
D. master_log_file : 从哪个日志文件开始同步(上述查询master状态中展示的有)
E. master_log_pos : 从指定日志文件的哪个位置开始同步(上述查询master状态中展示的有)
2.11 查看从库数据库状态
show slave status;
Slave_IO_running 和 Slave_SQL_running 都为YES,代表主从同步配置完成
2.12 测试
通过navicat连接数据库,主库建表、建库、插入数据,然后查看从库是否有建表、建库、插入数据即成功
参考资料:https://blog.csdn.net/han1725692339/article/details/125912816
https://blog.csdn.net/m0_62473957/article/details/124140928
5.3.6 监控
todo 目前网络上缺少相关资料,待补充
5.3.7 分库分表
1.定义
分库分表是对关系型数据库存储和访问机制的一种补充
分库:将一个库拆分到多个相同的库中,访问时访问一个库
分表:将一个表的数据放到多个表中,操作对应的某个表就行
2.分库分表的方式
垂直拆分、水平拆分
2.1 垂直拆分
库垂直拆分:例如将电商系统对应库拆分为订单库、商品库、会员库等
表垂直拆分:根据业务拆分表,例如user表拆分成base_user和user_info表
垂直拆分特点:每个库(表)的结构都不一样;每个库(表)的数据至少一列一样;每个库(表)的并集是全量数据
垂直拆分优点:拆分后业务更加清晰;数据维护更加简单;
垂直拆分缺点:如果单表的数据库量较多,读写压力大;一个业务会影响数据库的瓶颈;部分业务无法关联join,只能通过java去查询调用,提高了开发复杂的度
2.2 水平拆分
库水平拆分:例如会员库拆分,拆分会员1库,会员2库.以userId拆分,尾号是0-5的为1号库,尾号是6-9的为2号库等
表水平拆分:例如user表进行拆分为user1和user2表,将userId进行取模,奇数位于user1表,偶数位于user2表
水平拆分特点:每个库(表)的结构都一样;每个库(表)的数据都不一样;每个库(表)的并集是全量数据
水平拆分优点:单库/单表的数据保持在一定量,有助于性能提高;提升了系统的稳定性和负载能力;拆分表的结构相同,代码改造较少
水平拆分缺点:数据扩容有难度维护量大;拆分规则很难抽象;分片事务的一致性问题部分业务无法关联join,只能通过java程序接口调用
3.分库分表带来的问题
分布式事务、跨区join查询、分布式全局唯一id、开发水平要求较高
参考资料:https://blog.csdn.net/ahuangqingfeng/article/details/124161107