zoukankan      html  css  js  c++  java
  • mysql 备份

    备份考虑的问题

    业务连续性
    备份完整性

    备份种类

    逻辑备份

    特点:建表、建库、插入数据等操作所执行的语句(DDL DML DCL),适用于中小型数据库,效率相对较低,对存储引擎有要求。

    工具:  

      mysqldump     #官方
      mydumper      #第三方

    物理备份

    特点:文件系统层面备份。直接复制数据库文件,适用于大型数据库环境,不受存储引擎限制,但不能恢复到不同的Mysql版本。

    工具:

      tar、cp         #完全备份,需要停服务。

      lvm snapshot    #完全备份,热备份。数据库目录必须为逻辑卷,对整个目录逻辑卷做快照,为热备份,不需停服务,只要锁表即可

      xtrabackup        #完全/增量/差异都可以,热备,只限于Innodb 等引擎。

      inbackup

    完全备份

    对整个数据库备份

    增量备份

    周日全备份,周一在周日基础上做增量备份,周二在周一基础上做增量备份以此类推。

    差异备份

    周日全备份,周一、周二..都在周日基础上做增量备份

    各个备份工具使用

    注意各个备份工具都是基于某个时间点对数据做的备份,备份恢复也只是恢复到了备份时间点的数据库的状态,由于数据库处于动态变化中,所以想要完全恢复数据,还要结合Binlog日志去恢复。

    tar 备份

    备份过程
      停止数据库       systemctl  stop  mysqld

      记录binlog 位置    mysql -p'asdfgfdf' -e 'show master status' > /backup/position.txt        #binlog恢复时用到

      备份数据库文件     tar -zcvf /var/lib/mysql.tar.gz /var/lib/mysql

      启动数据库      systemctl  start  mysqld


    还原过程      
      停止数据库      systemctl  stop  mysqld

      清理旧数据      rm -rf  /var/lib/mysql/*        #如果是使用中的数据库,需要删除旧的数据,再导入备份数据

      导入数据库文件    tar -xf mysql-all-back.tar.gz  -C  /var/lib/mysql/

      启动数据库      systemctl  start  mysqld

      binlog 恢复

    lvm 快照备份

    备份过程

    1、加全局锁与创建快照
    echo "flush tables with read lock;SYSTEM lvcreate -s -n mysql_snap -L 1G /dev/mysql_vg/mysql_lv" | mysql -p'asdfgfdf'
    
    2、记录binlog位置
    mysql -p'asdfgfdf'  -e 'show master status' > /backup/position.txt    #记录binlog 日志位置
    
    3、从快照中备份:
    mount -o ro,nouuid /dev/mysql_vg/mysql_snap  /mnt    #如果是xfs 文件系统必须加nouuid 选项
    cd /mnt
    tar -zcf /backup/`date +%F`_mysql_all_backup.tar.gz  ./*
    
    4、删除快照:
    cd;umount /mnt
    lvremove -f     /dev/mysql_vg/mysql_snap
    View Code

    恢复
      同上tar
      binlog 恢复

    Notice

    lvm 快照的前提是mysql 数据目录必须挂载在逻辑卷上,如果没有需要迁移

    lvm 快照的前提是mysql 数据目录必须挂载在逻辑卷上,如果没有需要创建逻辑卷并迁移数据库目录到逻辑卷上面
    
    迁移过程
    systemctl   stop mysqld
    mkfs.xfs   /dev/mysql_vg/mysql_lv
    mount     /dev/mysql_vg/mysql_lv /mnt/         #将逻辑卷进行临时挂载
    cp -a /var/lib/mysql/* /mnt                 #拷贝所有数据到新的逻辑卷分区中
    umount /mnt                        #取消临时挂载
    echo "/dev/mysql_vg/mysql_lv /var/lib/mysql xfs defaults 0 0" > /etc/fstab   #将已有数据的逻辑卷永久挂载
    mount -a
    systemctl start mysqld
    View Code

    关于锁表操作

    问题:如果是手动锁表,必须在执行完快照创建后再退出登录的会话,否则锁表操作会随着会话退出而失效,如果是脚本执行锁表也会有此现象。如下
    mysql -p'asdfgfdf' -e 'flush tables with read lock;'    #注意脚本执行此语句锁住表后会自动退出mysql 登录会话,锁表操作就失效了,所以锁表操作与快照创建操作要一并执行在会话退出之前。
    
    解决:echo "flush tables with read lock;SYSTEM lvcreate -s -n mysql_snap -L 1G /dev/mysql_vg/mysql_lv" | mysql -p'asdfgfdf'
    另外:快照必须与被备份的逻辑卷位于同一个VG上面,避免空间不足可以指定其与源lv 同样大小
    View Code

    xtrabackup 备份

    安装(2.4.15)
    yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
    yum -y install percona-xtrabackup-24.x86_64

    完全备份

    innobackupex --defaults-file=/etc/my.cnf --user=root --password="123456" --backup /root        
    #根据配置文件中路径备份,无需停服务,备份目录中记录了binglog日志位置
    ll /root/2017-12-04_13-57-29/
    
    
    恢复
        systemctl stop mysqld
        innobackupex --apply-log /root/2017-12-04_13-57-29/
        innobackupex --defaults-file=/etc/my.cnf --copy-back /root/2017-12-04_13-57-29/
        binlog 恢复
        systemctl start mysqld
    View Code

    增量备份

    innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --incremental /backup/ --incremental-basedir=/root/2017-12-04_13-57-29
    #--incremental /backup/   指定增量备份文件备份的目录
    #--incremental-basedir    指定上一次全备或增量备份的目录
    根据前一天的增量再次做增备
    innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --incremental /backup/ --incremental-basedir=/root/2017-12-05_13-57-29
                
    恢复
        先把增量恢复到全备中
        innobackupex --apply-log --redo-only /root/2017-12-04_13-57-29/
        innobackupex --apply-log --redo-only /root/2017-12-04_13-57-29/ --incremental-dir=/backup/2017-12-05_09-27-06/
        恢复全部数据
        innobackupex --defaults-file=/etc/my.cnf --copy-back /root/2017-12-04_13-57-29/
        也可以通过cp /root/2017-12-04_13-57-29/  /var/lib/mysql/ 替代上面命令
    View Code

    差异备份
    命令一样,指定的目录始终为完全备份

    注意:无论哪种备份都要先记录binlog 日志位置

    mysql -p'asdfgfdf' -e 'show master status' > /backup/position.txt   #binlog 日志恢复时用到

    mysqldump备份

    mysqldump 备份语句

    --master-data=1/2 #1不注释,2 注释

    备份过程

    flush  tables  with read  lock;                 #会话别退出,执行完mysqldump后再退出

     mysqldump -h192.168.1.100 -p3306 -uroot -ppassword --all-databases --master-data=1 > /data/backup/all_db.sql    #--master-data 记录binlog 位置,方便binlog恢复查找。

    unlock tables;

    恢复数据库

    如果是旧数据库需要进行前4步
    1.停止数据库
    2.清理数据rm -rf /var/lib/mysql/*        #注意不需要删除日志文件(slowlog binlog log)
    3.启动数据库                    #数据库必须是启动的
    4.改密码
    5.SET SQL_LOG_BIN=0        #暂停binlog 日志,恢复时记录不必要的binlog ,所以可以暂停,当然不是必须的
    6.登录musql执行source  /backup/2017-12-05_09-27-06.sql
       或  mysql -p'asdfgfdf'  < /backup/2017-12-05_09-27-06.sql
    注意:暂停binlog与执行恢复语句必须在同一会话下进行,参考lvm 快照备份加锁操作。
    7.刷新授权    flush logs;    
    8.binlog 恢复
    View Code

    mysqldump 恢复数据如果仅仅恢复某一个数据库,可以直接删除数据库再恢复,无需停服务。

    数据备份(之备份表中数据,不备份数据库和表结构)

    备份数据

    select * from test.school into outfile  '/back/school.txt'

    模拟误删除数据

    delect  from test.school

    恢复数据    也把在excel中的数据通过语句导入mysql 表中

    load data infile '/back/school.txt' into table test.school;

    Notice

    5.7以后mysql 安全增强了,必须指定一个安全目录,导出数据到指定目录才可以
    
    vi /etc/my.cnf
        secure-file-priv=/back
        chown mysql.mysql /back -R
    View Code

    备份导出的几种文件格式

    mysql -uroot -p'asdfgfdf' -e 'select * from test.school'  > /back/school.txt
    mysql -uroot -p'asdfgfdf' --xml  -e 'select * from test.school'  > /back/school.xml
    mysql -uroot -p'asdfgfdf' --html -e 'select * from test.school'  > /back/school.html

    执行导入或者导出语句时也可以添加以下限制条件

    FIELDS TERMINATED BY ','            //定义字段分隔符,不加默认就是空格
    OPTIONALLY ENCLOSED BY ""            // 定义字符串使用什么括号括起来
    LINES TERMINATED BY '
    ';            //定义换行符
  • 相关阅读:
    触发器
    突然的感慨
    最近接手一个asp老项目,运行了4,5年了
    导出sql语句相关问题
    PHP入门速成
    统一项目时间格式(DateTime.ParseExact使用)
    想法太多了就是三脚猫。
    个人习惯培养计划(转):以此为诫,努力提高自身素质。
    excel处理函数打包
    ASP.Net MVC探索之路 增加字符串长度范围校验Attribute
  • 原文地址:https://www.cnblogs.com/fanggege/p/11220666.html
Copyright © 2011-2022 走看看