3、mysql事务控制语句及日志管理

发布于:2024-12-21 ⋅ 阅读:(12) ⋅ 点赞:(0)

事务控制语句

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进行日志管理。