当前位置: 首页 > news >正文

Linux运维新手的修炼手扎之第26天

mysql服务

1 事务:
#开启事务 mysql> begin;
#事务回滚(撤销未提交的修改) mysql> rollback;
#保存回滚点p1 mysql> savepoint p1;
#回滚至保存点p2 mysql> rollback to p2;
#提交事务 mysql> commit;
三种问题:脏读--读到了其他事务未提交的数据,未提交意味着这些数据可能会回滚,也就是可能最终不会存到数据库中,也就是不存在的数据。读到了并不一定最终存在的数据
不可重复读--在同一事务内,不同的时刻读到的同一批数据可能是不一样的,可能会受到其他事务的影响,比如其他事务改了这批数据并提交了
幻读--一个事务先根据某些条件查询出一些记录,之后另一个事务又向表中插入了符合这些条件的记录,原先的事务再次按照该条件查询时,能把另一个事务插入的记录也读出来
事务隔离级别:读未提交(你没有提交的时候,我就看到你修改的数据)、读已提交(你提交后,我才可以看到你修改的数据)、可重复读[默认级别](你提交了,我也提交了,我才有能力读自己的数据)、可串行化(咱们俩谁先开始,另外一个人处于等待状态)    
2 日志:
事务日志:逻辑-undo log(撤销日志)、物理-redo log(重做日志),记录InnoDB等支持事务的存储引擎执行事务时产生的日志

错误日志:log_error,记录MySQL服务的启动、运行或停止服务时出现的问题,通常也会记录Warning

#定制错误日志路径[熟练]
(1)准备工作目录
root@ubuntu24-16:~# mkdir /data/mysql/logs -p
root@ubuntu24-16:~# chown mysql:mysql -R /data/mysql/logs
(2)修改配置文件
root@ubuntu24-16:~# vim /etc/mysql/mariadb.conf.d/50-server.cnf
[mariadbd]
log-error=/data/mysql/logs/mysqld.log
#log_error = /var/log/mysql/error.log # 默认没有启用
(3)重启服务 root@ubuntu24-16:~# systemctl restart mariadb
(4)测试效果 MariaDB [(none)]> select @@log_error;

        通用日志又叫通用查询日志:general_log,来记录对数据库的所有操作,包括启动和关闭MySQL服务、更新语句和查询语句等,默认不开启
#general_log=0|1 是否开启通用日志(默认关闭)

慢查询日志:slow_query_log,记录在MySQL中执行时间超过指定时间的查询语句,可以查找出哪些查询语句的执行效率低,以便进行优化,默认不开启,默认查询超时阈值为10秒
#slow_query_log=0|1 是否开启记录慢查询日志

二进制日志:log_bin,用于记录数据库的变化情况,即SQL语句的DDL和DML语句,但不包含查询操作语句,因为查询语句并不会改变数据库中的数据,如果 MySQL 数据库意外停止,可以根据二进制日志文件中的记录来恢复数据库服务器,自MySQL8.0开始,默认开启了二进制日志功能

#显示所有与二进制日志相关的系统变量(查看二进制日志是否启用) 
show variables like "%log_bin%";
#查看当前服务的二进制文件列表
SHOW MASTER LOGS # mysql 8.4 版本之前用,mariadb 11.8支持
SHOW BINARY LOGS # mysql 8.4 版本之后用,mariadb 11.8支持
#查看正在使用的二进制文件
SHOW MASTER STATUS # mysql 8.4 版本之前用,mariadb支持
SHOW BINARY LOG STATUS; # mysql 8.4 版本之后用,mariadb不支持

                二进制日志记录三种格式:
- Statement:语句的记录模式,日志中会记录原生执行的SQL语句,对于某些函数或变量不会替换
- Row:行记录模式,会将SQL语句中的变量和函数进行替换后再记录
- Mixed:混合记录模式,MySQL会根据具体的SQL语句来分析采用哪种模式记录日志

定制二进制存储[熟练]
(1)准备日志专用目录
root@ubuntu24-16:~# mkdir /data/mysql/logs/ -p
root@ubuntu24-16:~# chown mysql:mysql -R /data/mysql/logs
(2)定制日志配置
root@ubuntu24-16:~# vim /etc/mysql/mariadb.conf.d/50-server.cnf
[mariadbd]
log_bin=/data/mysql/logs/binlog # 注意 -- 最后的binlog是文件名前缀,不是目录
(3)重启服务 root@ubuntu24-16:~# systemctl restart mariadb
(4)确认效果 
root@ubuntu24-16:~# ls /data/mysql/logs/binlog*
/data/mysql/logs/binlog.000001  /data/mysql/logs/binlog.000002
/data/mysql/logs/binlog.index
刷新二进制日志文件[熟练]:
方法一---重启服务 root@ubuntu24-16:~# systemctl restart mariadb
方法二---手工刷新二进制文件 MariaDB [db1]> flush logs;
方法三---mariadb专用的 mysqladmin 工具刷新 root@ubuntu24-16:~# mysqladmin flush-logs
查看效果 MariaDB [db1]> show binary logs;
清理二进制日志:根据条件部分清理:#PURGE BINARY LOGS TO 'binlog.000002';  删除binlog.000002之前的日志,会保留binlog.000002文件及之后的#PURGE BINARY LOGS BEFORE '2025-12-31';  清理2025-12-31之前的日志全部清理并重新生成日志文件:#reset master;  重置所有二进制文件,序号从1开始#resat master to 5;  只剩下指定的日志binlog.000005,而且这个日志是清理所有日志后重新建立的日志,虽然名字是之前的,但是内容已经是新的了

中继日志:集群中用的

【事务日志和二进制日志的区别:--事务日志可以看作是在线日志,二进制日志可以看作是离线日志 --事务日志记录事务执行的过程,包括提交和未提交,二进制日志记录只记提交的过程--事务日志只支持InnoDB存储引擎,二进制支持 InnoDB和MyISAM存储引擎--事务日志的容量是100M的大小,会滚动覆盖式更新,二进制的容量大小没有限制】

3 备份:
类型:全量(完整备份所有数据)、增量(仅备份上次备份后变化的数据,依赖上次全量或增量备份)、差异(备份上次全量备份后变化的所有数据) | 热备(备份时业务正常运行,数据可读写--binlog)、冷备(备份时业务停止,数据不可访问--拷贝离线数据文件)、温备(备份时业务只读,数据不可写入) | 物理(直接备份底层数据文件如数据库文件)、逻辑(备份数据的逻辑结构如SQL语句)
【全量(周一完整备份)+ 增量(周二~周五备份每日新增)→ 恢复需按顺序:全量→增量1→增量2...
全量(周一完整备份)+ 差异(周二~周五备份周一以来的所有变化)→ 恢复只需:全量+最后一次差异】
数据库备份内容:数据库中的数据、二进制日志,InnoDB 事务日志、用户账号,权限配置,程序代码(视图,存储过程,触发器,事件调度器)、相关配置文件

命令:mysqldump-A 全量备份(数据+结构)#直接备份所有数据库 root@ubuntu24-13:~# mysqldump -A > /data/backup/all-bak.sql#备份时可以开启压缩减小体积 root@ubuntu24-13:~# mysqldump -A | gzip > /data/backup/all-bak.sql.gz【mysqldump -A | gzip > /data/backup/all-bak-$(date +%Y%m%d).sql.gz】#查看文件内容 cat /data/backup/all-bak.sql#还原数据库root@ubuntu24-13:~# mysql < /data/backup/all-bak.sqlroot@ubuntu24-13:~# zcat /data/backup/all-bak.sql.gz | mysql -B db1 指定数据库备份(数据+结构)root@ubuntu24-13:~# mysqldump -B db1 > /data/backup/db1-bak.sql【多个数据库 mysqldump -B db1 db2 db3 db4 > /path/to/db-bak.sql】#还原数据库root@ubuntu24-13:~# mysql -e "drop database db1;"(删除当前数据库)root@ubuntu24-13:~# mysql < /data/backup/db1-bak.sql-B db1 table2 指定表备份
冷备份和还原实践[熟练]
(1)数据库环境准备
ubuntu16主机:
#准备日志专用目录
mkdir /data/mysql/logs -p
chown mysql:mysql -R /data/mysql/logs
#定制日志配置
vim /etc/mysql/mariadb.conf.d/50-server.cnf
[mariadbd]
log_bin=/data/mysql/logs/binlog #最后的binlog是文件名前缀,不是目录
#重启服务
systemctl restart mariadbUbuntu13主机:
mkdir /data/mysql/logs/ -p
chown mysql:mysql -R /data/mysql/logs
vim /etc/mysql/mariadb.conf.d/50-server.cnf
[mariadbd]
log_bin=/data/mysql/logs/binlog 
systemctl restart mariadb
create database db1;
use db1;
CREATE TABLE `student` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(255) NOT NULL,`age` int(11) NOT NULL,`gender` enum('M','F') NOT NULL,PRIMARY KEY (`id`)
);
insert into student(name,age,gender)values('u11',11,'M'),('u22',22,'F');
insert into student(name,age,gender)values('u11',11,'M'),('u22',22,'F')Ubuntu16主机删除数据库:drop database db1
或者
systemctl stop mariadb.service #停止MariaDB服务
rm -rf /var/lib/mysql/* #删除MariaDB默认数据目录中的所有文件(包括所有数据库和表)
rm -rf /data/mysql/logs/* #删除自定义日志目录中的文件(如果有配置额外日志路径)
mysql_install_db --user=mysql --basedir=/usr --datadir=/var/lib/mysql #重新初始化MariaDB数据目录,生成系统库(如mysql、performance_schema等)参数说明:--user=mysql:以mysql用户权限运行。--basedir=/usr:指定MariaDB安装路径。--datadir=/var/lib/mysql:指定数据存储路径。
chown -R mysql:mysql /var/lib/mysql #递归设置数据目录的所有者为mysql用户和组
systemctl start mariadb.service #重新启动MariaDB服务(2)对ubuntu13主机进行冷备份
ubuntu13主机:
#查看当前效果
MariaDB [db1]> show databases; 
MariaDB [db1]> show tables from db1; 
MariaDB [db1]> select count(*) from db1.student;
#关闭服务
systemctl stop mariadb.service
#备份数据
mkdir /data/backup -p
cd /data/backup/
tar zcf base_data.tar.gz /var/lib/mysql
tar zcf binlog_data.tar.gz /data/mysql/logs
lsubuntu16主机:
#获取备份数据
mkdir /data/backup
cd /data/backup/
ls
rsync root@10.0.0.13:/data/backup/*.gz ./
ls
原则上来说,最好再将配置文件内容也同步过来一份,如果核心配置能够保证是一样的,此步非必须
scp root@10.0.0.13:/etc/mysql/mariadb.conf.d/50-server.cnf /etc/mysql/mariadb.conf.d/50-server.cnf(3)在Ubuntu16主机上进行冷还原
Ubuntu16主机:
#清空数据为还原做准备root@ubuntu24-16:/data/backup#
systemctl stop mariadb.service
rm -rf /var/lib/mysql/*
rm -rf /data/mysql/logs/*
#解压文件
tar xf base_data.tar.gz
tar xf binlog_data.tar.gz
ls
#转移文件
mv ./var/lib/mysql/* /var/lib/mysql/
mv ./data/mysql/logs/* /data/mysql/logs/
#更改文件权限
chown mysql:mysql -R /data/mysql/*
chown mysql:mysql -R /var/lib/mysql
#启动mysql服务
systemctl start mariadb
#连接到数据库里面确认效果--数据修复成功
MariaDB [(none)]> show databases;
MariaDB [(none)]> select count(*) from db1.student;

http://www.dtcms.com/a/322638.html

相关文章:

  • Effective C++ 条款31: 将文件间的编译依存关系降至最低
  • 飞算JavaAI:人工智能与Java的创新融合与应用前景
  • 5、docker镜像管理命令
  • Qt/C++开发监控GB28181系统/实时监测设备在线离线/视频预览自动重连/重新点播取流/低延迟
  • MySQL 复制表详细说明
  • 某金融APP防护检测分析
  • PromptPilot打造高效AI提示词
  • 智慧农业-无人机视角庄稼倒伏农作物倒伏检测数据集VOC+YOLO格式541张1类别
  • 计算机视觉CS231n学习(6)
  • 跨境电商系统开发:ZKmall开源商城的技术选型与代码规范实践
  • 3D感知多模态(图像、雷达感知)
  • node.js 零基础入门
  • LangChain-Unstructured 基础使用:PDF 与 Markdown 处理解析
  • SwiftUI 登录页面键盘约束冲突与卡顿优化全攻略
  • 为什么动态导入中Vite无法正确解析别名路径?
  • 如何在 Excel 中快速求和?【图文详解】Excel求和技巧,Excel求和公式大全,多种方式求和
  • 【线性代数】6二次型
  • 【线性代数】目录
  • 【线性代数】线性方程组与矩阵——(2)矩阵与线性方程组的解
  • sqli-labs靶场less51~less65
  • Debian防火墙 ufw
  • DataDex 多样化 JSON 服务——使用教程
  • K8s-pod控制器
  • Web前端之Vue框架
  • Java Stream API 实战:提升集合处理的效率与可读性!
  • 使用 Visual Studio 2022 编译 PortAudio 项目
  • 华为实验NAT
  • spring.config.import 不存在
  • 文生图工具之ComfyUI从原理到实践的全维度剖析
  • 矩阵的条件数 向量的条件数