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

你可能感兴趣的:(Java系列,mysql)