Py学习  »  DATABASE

MySQL备份与还原

phff • 3 年前 • 242 次点击  

MySQL数据备份

  • mysql的备份分类
    冷备份 (mysql服务需停止,然后去拷贝数据)
    热备份(mysql服务运行的情况下去备份)

    物理备份 (Linux系统的文件系统上)
    逻辑备份(进入mysql内部)
    物理备份的工具:cp、scp、tar、rsyncrsync
    rsyncrsync命令:同步备份,有修改会同步修改
    逻辑备份的工具:mysqldump

    本地备份 / 异地备份

  • mysql的备份方法
    1、完全备份(Full backup) — 全部内容都备份下来
    优点:恢复的快,省事
    缺点:备份的时候慢、消耗空间大
    2、增量备份(Incremental) — 每次比较和上次备份进行比较
    优点:每次备份都没有重复的数据
    缺点:恢复的时候很麻烦
    3、差异备份 — 每次备份都和完全备份进行比较
    备份的时候数据重复性较低,恢复的时候也不麻烦

备份的时候用哪种方法具体用哪种备份方法视实际情况(场合、条件、数据量)

linux下的MySQL备份工具
我使用的是: mysqldump
使用方法:

  • 在mysql中输入命令:
    grant all on . to ‘currybackup’@’%’ identified by ‘Sanchuang123#’;
    用处: 创建一个用户currybackup密码为Sanchuang123#,可以用于mysql操作sql

  • 在Linux中输入命令:
    mysqldump -ucurrybackup -p’Sanchuang123#’ sanchuang > /curry/backup/sanchuang.
    用处:将数据库sanchuang备份到/curry/backup/sanchuang

  • 在Linux中输入命令:
    mysql -ucurrybackup -p’Sanchuang123#’ sanchuang < sanchuang.sql
    用处:将sanchuang.sql数据文件还原到sanchuang数据库中,如果sanchuang数据库已经被删掉了,那么需要自己创建

此外,再举一些命令来介绍mysqldump的用法:
mysqldump -uroot -p’Sanchuang123#’ --databases TENNIS >/backup/tennis.sql
这是备份数据库databases下的TENNIS表到/backup/tennis.sql
mysqldump --all-databases > /backup/dump.sql
这是备份所有的数据库到/backup/dump.sql

  • 写一个脚本来备份数据 库:
    要求:
    1、每天晚上3:30开始备份sc数据库
    2、备份文件存放到/backup目录下,要求备份的文件名包含当天的日期
    3、保留最近15天的备份文件
    4、每备份一次都记录到日志文件/var/log/backup_db.log

脚本如下:取名为backup_db.sh,存放在/lianxi目录下

#!/bin/bash
# 获取当前时间
ctime=$(date +%Y%m%d)
mkdir -p /backup
#备份sc库
/usr/bin/mysqldump -ucurrybackup -p'Sanchuang123#' sc > /backup/sc123_${ctime}.sql
# 只保留本机上最近十五天的数据
find /backup -mtime +15 -type f -name "sc123*.sql" -exec rm -rf {} \;
#日志功能
now_time=$(date +%Y%m%d%H%M%S)echo "${now_time} sc123_${ctime}.sql success!" >>/var/log/backup_db.log
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

然后创建计划任务Linux下输入命令:crontab -e
30 3 * * * bash /lianxi/backup_db.sh
最后使用crontab -l 命令查看计划任务是否创建成功就可以了

MySQL数据还原

此处介绍使用二进制日志来还原MySQL数据,
所有前提是要先开启MySQL的二进制日志,因为二进制日志默认是关闭的,
如需了解二进制日志可以查看我的另一篇博客,有介绍MySQL的二进制日志以及其他的一些日志。
如果想知道自己的二进制日志是否打开,MySQL命令行中输入命令:show variables like '%og_bin’来查看

1. 时间点还原
show master status; 查看MySQL当前正在使用的二进制日志及当前执行二进制日志位置
假如我当前MySQL使用的是二进制日志是iZ8vb7qowz9hfo2gsi9juoZ-bin.000002
下一步,也是最难的一步:
mysqlbinlog -vv iZ8vb7qowz9hfo2gsi9juoZ-bin.000002
这个二进制文件不能用文本编辑器打开,因为这是一个二进制文件,可以用mysqlbinlog打开,-vv可以显示的更加详细。然后你要做的就是从这个二进制文件中找到你要从哪一步恢复到哪一步,找到他们对应的时间点,然后执行下面这个命令(我找到的时间就是下面这个):
mysqlbinlog --start-datetime=“2020-08-13 14:54:02” --stop-datetime=“2020-08-13 14:54:08” iZ8vb7qowz9hfo2gsi9juoZ-bin.000002 | mysql -ucurrybackup -p’Sanchuang123#’
执行成功之后这段时间里面你所执行的数据就恢复了。
–start-datetime - 起始时间
–stop-datetime - 终止时间
iZ8vb7qowz9hfo2gsi9juoZ-bin.000002 | mysql -ucurrybackup -p’Sanchuang123#’

2. 位置号还原
方法与时间点还原类似,只不过需要在二进制日志中找的不是时间点,而是对应的位置号,下面的命令执行的格式也是与时间点还原差不多。
找到之后执行下面的命令:
mysqlbinlog --start-position=291 --stop-position=697 /data/mysql/sc-mysql-bin.000005 |mysql -uroot -p’Sanchuang123#’

备份还原的难点在于找到还原处对应的时间点或者位置号,此处贴图一张稍微讲解一下怎么找自己想还原的数据段对应的时间点或者位置号
在这里插入图片描述

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/72508
 
242 次点击