事务控制语句
begin:显示开始一个事务
commit:提交事务,所有的修改都是永久性的。
rollback:对事务进行回滚,返回到上一次的操作,只能回滚正在进行会提交的修改。
savepoint 名称:在事务当中创建一个回滚点,回滚到指定的位置,一个事务中可以有多个回滚点。savepoint在一个事务当中是一个临时的标记,在事务执行过程中的一个回滚点,多个回滚点,是按照顺序进行的。前面的回滚点一旦执行,后续的回滚点就会失效。
行锁和死锁
innodb的行锁的死锁,innodb通过给索引加索来实现行级的锁定。
如果没有索引,会使用隐藏的聚簇索引来实现锁定。
行锁:如果A事务对索引字段进行操作,就会触发聚簇索引,锁定整行,B事务对这个行进行的操作就会被锁住。
死锁:两个事务相互等待对方的资源,形成了一个环路导致的。死锁发生会自动选择一个事务当中的语句进行执行,直接终止其中的一个事务,然后回滚另外一个事务,以解除死锁。
避免死锁的方法
1、按照固定的顺序对表和行进行访问
2、大事务拆成小事物,业务允许的情况下。
3、调整事务的默认隔离级别。如果业务允许,隔离级别越低越好。
4、要给表添加合适的索引(不是经常需要访问的字段,最好不要设索引)
mysql的备份和恢复及日志管理
备份的目的就是灾难恢复
冷备份和热备份
1、物理备份
冷备份:关闭数据库进行备份,全量备份。
2、逻辑备份
热备份:数据库可以正常运行,不影响数据库的操作,在这个条件可以实现备份和恢复。
冷备份只能全量备份;逻辑备份既可以实现全量备份,也可以实现增量备份。
mysqldump:常用的逻辑备份的工具,mysql自带的。
备份策略
冷备份
冷备份也是全量备份,就是在关闭数据库的情况下,进行备份打包mysql的日志文件,再通过解压恢复到他日志文件指定目录下。
1、关闭mysql
systemctl stop mysqld
2、查看mysql日志文件的位置
通过mysql主配置文件查看
3、打包日志文件
tar Jcvf /opt/mysql_all_$(date +%F).tar.xz /usr/local/mysql/data/
4、解压并复制数据到指定目录
注意一定要保留权限复制,因为mysql目录下的所有者和所在组都属于mysql。
mysqldump的备份和恢复
mysqldump是针对库和表的全量和增量,是热备份。
把备份的库和表,以文件的形式导出,再从导出的文件进行恢复。
库的备份和恢复
mysqldump -u root -p123456 --databases zw102 > /opt/zw102.sql
mysql -u root -p123456 < /opt/zw102.sql
这样我们库zw102备份好了之后,会生产一个zw102.sql文件,如果zw102.sql被删了之后,可以通过这个备份文件恢复。
表的备份和恢复
mysqldump -u root -p123456 zw102 cost student > /opt/cost_s.sql
mysql -u root -p123456 zw102 < /opt/cost_s.sql
注意:备份表要指定哪个库的表,如备份库zw102下的表cost和表student;同理恢复的时候也要指定恢复到哪个库。
二进制日志备份和恢复
全量备份
使用mysql的二进制日志的方式备份,对数据的全量或者增量备份
1、修改mysql配置文件,添加如下两段
#开启二进制日志的功能,二进制文件的名称mysql_bin.xxxx
#二进制日志的记录格式
- ROW:基于行;记录每一条的数据,准确,但是恢复的效率低。
- STATEMENT:基于sql语句;按照顺序对sql语句进行记录,高并发的情况下,sql语句顺序可能会出错,可能会导致数据记录有偏差,虽然恢复的效率比较高。
- MIXED:混合;正常情况下使用STATEMENT,高并发自动切换
重启mysql服务后,mysql保存日志文件目录下,会生产一个mysql_bin.000001文件,他就是记录日志的二进制文件
2、解析二进制日志的内容
通过解析二进制文件内容,可以查看我们的操作日志,包括增删改查等等所有操作内容。
mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql_bin.000001
注意:从我们生产mysql_bin.000001开始,所有记录都备份在000001文件
3、刷新二进制日志的内容
这时候我们刷新断点,会产生一个新的二进制日志文件mysql_bin.000002。表示我们从mysql_bin.000001开始备份,刷新断点之后的所有操作日志都将保存在mysql_bin.000002里。如果我们要恢复之前的日志,即恢复mysql_bin.000001。
mysqladmin -u root -p123456 flush-logs
- 这个断点一般做定时任务按天来执行的,我们就可以按天对数据进行增量的备份。
4、恢复二进制日志的内容
mysqlbinlog --no-defaults mysql_bin.000001 | mysql -u root -p123456
注意:恢复mysql_bin.000001内容,会把里面记录的所有操作都执行一遍,如果记录的表或者库还在会报错。
基于位置的恢复
查看二进制日志文件内容,可见在 3739 这个位置,241220 15:32:46 这个时间,我们delete了库zw102,表student里面4相应的内容。
1、从指定位置开始到最后恢复数据
这时候发现我们mysql_bin.000001里面,是在位置1744增加了4相关信息
如恢复mysql_bin.000001里面从位置1744开始一直到最后的所有操作
mysqlbinlog --no-defaults --start-position='1744' mysql_bin.000001 | mysql -u root -p123456
这时候我们删除的内容也就恢复了
2、从开始位置开始恢复到结束位置
如恢复mysql_bin.000001里面从一开始位置到1744的所有操作(start换stop即可)
mysqlbinlog --no-defaults --stop-position='1744' mysql_bin.000001 | mysql -u root -p123456
这里的报错,是因为位置1744之前的操作都是建库创表的内容,我们的数据库里面已经都存在了,不能重复。
3、从指定位置开始,到指定位置结束
还是老样子我们恢复4相关信息,就是恢复mysql_bin.000001里面从1744开始位置到1901的所有操作。(start—stop即可)
mysqlbinlog --no-defaults --start-position='1744' --stop-position=''1901 mysql_bin.000001 | mysql -u root -p123456
注意:二进制日志文件里面,每一个操作都是以BEGIN开始,COMMIT结尾的,所有位置到1901而不是1870,是因为COMMIT相当于运行,一定要选择运行之后,时间也是如此。
基于时间的恢复
还是老样子我们恢复1-5相关信息,就是恢复从开始时间2041220 16:08:47到2041220 16:10:18的所有操作。(位置改成时间即可)
mysqlbinlog --no-defaults --start-datetime='2024-12-20 16:08:47' --stop-datetime='2024-12-20 16etime='2024-12-20 16:10:18' mysql_bin.000003 | mysql -u root -p123456
这时候1-5相关信息便恢复了。注意:如果有的操作是在一起执行的,也就是时间一样,最好不要使用基于时间的恢复,防止恢复不全。
mysql的日志管理
要在mysql的主配置文件,添加如下内容
log-error=/usr/local/mysql/data/mysql_error.log
- #记录mysql在启动,停止或者运行时,产生错误的日志
general_log=ON
general_log_file=/usr/local/mysql/data/mysql_general.log
- #开启mysql在使用过程中的记录日志
slow_query_log=ON
slow_query_log_file=/usr/local/mysql/data/mysql_slow_query.log
long_query_time=5
- #开启mysql慢查询日志,用来记录所有查询的时间超过5秒的记录,不注明默认10秒。
这时候mysql保存日志的目录下,会生产相应的日志文件,方便我们对Mysql进行日志管理。