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

相关推荐
矛取矛求1 小时前
高级sql技巧
数据库·sql·mysql
计算机学姐2 小时前
基于Python的影院电影购票系统
开发语言·vue.js·后端·python·mysql·pycharm·pip
是僵尸不是姜丝2 小时前
MySQL基础篇总结
数据库·mysql
幽兰的天空3 小时前
深入解析 MySQL 数据库:锁表的处理
数据库·mysql
qq_433716955 小时前
Postman断言与依赖接口测试详解!
自动化测试·软件测试·功能测试·测试工具·mysql·接口测试·postman
_半夏曲5 小时前
修改Mysql 8 的密码
数据库·mysql
idealzouhu6 小时前
【canal 中间件】canal 实时监听 binlog
mysql·canal
stars_User6 小时前
MySQL详细安装教程
数据库·mysql
编程学无止境6 小时前
第05章 MySQL目录结构、源码和常见问题汇总
数据库·mysql
shiran小坚果6 小时前
AWS RDS MySQL内存使用
数据库·mysql·云计算·database·aws