1. 程式人生 > >mysql資料備份總結

mysql資料備份總結

mysql資料備份(重要)

​ 對於一個網站來說,資料是最重要的,也是無可替代的,伺服器宕機可以更換硬體,專案丟失都可以根據之前的需求重寫,但是資料丟失對於一個公司來說,是災難性的,所以下面,主要介紹幾種常用的mysql備份方式

資料的備份型別

資料的備份主要分為以下兩類

  1. 完全備份:備份整個資料庫
  2. 部分備份:備份部分資料集,又分為以下兩種
    1. 增量備份:備份上一次備份以後的增量資料,優點:省空間;缺點:還原複雜
    2. 差異備份:本分上一次完全備份以後變化的資料,缺點:浪費空間;有點:還原簡單

mysql的資料備份有以下幾種

  1. 熱備份:資料庫進行備份時,讀寫不受影響
  2. 溫備份:資料庫進行備份時,可讀不可寫
  3. 冷備份:資料庫進行備份時,不可讀寫,資料庫也不可訪問

在考慮備份方式時,還要考慮到資料庫本身的儲存引擎

引擎 熱備 溫備 冷備
MyISAM ×
InnoDB

資料備份與恢復

一、複製檔案進行資料恢復

  1. 定時複製mysql目錄下,data資料夾下相關資料庫的資料夾
  2. 資料丟失後,直接將資料夾還原(不可重灌資料庫或在新資料庫上進行直接複製,可能導致資料無法使用)

二、mysqldump+binlog進行資料恢復

  1. 定時利用mysqldump備份全表資料
  2. 定期備份binlog作為增量檔案備份
  3. 資料丟失後,首先利用MySQLdump匯出的資料進行恢復,然後將增量資料逐步恢復(恢復時間很長,尤其是表格資料較多時)

三、使用lvm2快照備份(未測試)

  1. 部署lvm環境

    #新增硬碟; 這裡我們直接實現SCSI硬碟的熱插拔, 首先在虛擬機器中新增一塊硬碟, 不重啟
    [[email protected]
    ~]
    # ls /dev/sd* #只有以下幾塊硬碟, 但是我們不重啟可以讓系統識別新新增的硬碟 /dev/sda /dev/sda1 /dev/sda2 [[email protected] ~]# echo '- - -' > /sys/class/scsi_host/host0/scan [[email protected] ~]# echo '- - -' > /sys/class/scsi_host/host1/scan [[email protected] ~]# echo '- - -' > /sys/class/scsi_host/host2/scan [[email protected] ~]# ls /dev/sd* #看!sdb識別出來了 /dev/sda /dev/sda1 /dev/sda2 /dev/sdb [[email protected] ~]# fdisk /dev/sdb #分割槽 Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel Building a new DOS disklabel with disk identifier 0xd353d192. Changes will remain in memory only, until you decide to write them. After that, of course, the previous content won't be recoverable. Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite) WARNING: DOS-compatible mode is deprecated. It's strongly recommended to switch off the mode (command 'c') and change display units to sectors (command 'u'). Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 1 First cylinder (1-2610, default 1): Using default value 1 Last cylinder, +cylinders or +size{K,M,G} (1-2610, default 2610): +15G Command (m for help): t Selected partition 1 Hex code (type L to list codes): 8e Changed system type of partition 1 to 8e (Linux LVM) Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks. You have new mail in /var/spool/mail/root [[email protected] ~]# partx -a /dev/sdb BLKPG: Device or resource busy error adding partition 1 ##建立邏輯卷 [[email protected] ~]# pvcreate /dev/sdb1 Physical volume "/dev/sdb1" successfully created [[email protected] ~]# vgcreate myvg /dev/sdb1 Volume group "myvg" successfully created [[email protected] ~]# lvcreate -n mydata -L 5G myvg Logical volume "mydata" created. [[email protected] ~]# mkfs.ext4 /dev/mapper/myvg-mydata #格式化 [[email protected] ~]# mkdir /lvm_data [[email protected] ~]# mount /dev/mapper/myvg-mydata /lvm_data #掛載到/lvm_data [[email protected] ~]# vim /etc/my.cnf #修改mysql配置檔案的datadir如下 datadir=/lvm_data [[email protected] ~]# service mysqld restart #重啟MySQL ####重新匯入employees資料庫########略過####
  2. 建立快照卷並備份

    mysql> FLUSH TABLES WITH READ LOCK;     #鎖定所有表
    Query OK, 0 rows affected (0.00 sec)
    
    [[email protected] lvm_data]# lvcreate -L 1G -n mydata-snap -p r -s /dev/mapper/myvg-mydata   #建立快照卷
      Logical volume "mydata-snap" created.
    
    mysql> UNLOCK TABLES;  #解鎖所有表
    Query OK, 0 rows affected (0.00 sec)
    
    [[email protected] lvm_data]# mkdir /lvm_snap  #建立資料夾
    [[email protected] lvm_data]# mount /dev/myvg/mydata-snap /lvm_snap/  #掛載snap
    mount: block device /dev/mapper/myvg-mydata--snap is write-protected, mounting read-only
    
    [[email protected] lvm_data]# cd /lvm_snap/
    [[email protected] lvm_snap]# ls
    employees  ibdata1  ib_logfile0  ib_logfile1  mysql  mysql-bin.000001  mysql-bin.000002  mysql-bin.000003  mysql-bin.index  test
    [[email protected] lvm_snap]# tar cf /tmp/mysqlback.tar *  #打包檔案到/tmp/mysqlback.tar
    
    [[email protected] ~]# umount /lvm_snap/  #解除安裝snap
    [[email protected] ~]# lvremove myvg mydata-snap  #刪除snap
    
  3. 恢復資料

    [[email protected] lvm_snap]# rm -rf /lvm_data/*
    [[email protected] ~]# service mysqld start    #啟動MySQL, 如果是編譯安裝的應該不能啟動(需重新初始化), 如果rpm安裝則會重新初始化資料庫
    
    
    mysql> SHOW DATABASES;   #檢視資料庫, 資料丟失!
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | test               |
    +--------------------+
    3 rows in set (0.00 sec)
    
    [[email protected] ~]# cd /lvm_data/
    [[email protected] lvm_data]# rm -rf * #刪除所有檔案
    [[email protected] lvm_data]# tar xf /tmp/mysqlback.tar     #解壓備份資料庫到此資料夾 
    [[email protected] lvm_data]# ls  #檢視當前的檔案
    employees  ibdata1  ib_logfile0  ib_logfile1  mysql  mysql-bin.000001  mysql-bin.000002  mysql-bin.000003  mysql-bin.index  test
    

    三、xtrabackup資料恢復

    1. 備份資料

      [[email protected] ~]# mkdir /extrabackup  #建立備份目錄
      [[email protected] ~]# innobackupex --user=root /extrabackup/ #備份資料
      ###################提示complete表示成功*********************
      
      [[email protected] ~]# ls /extrabackup/  #看到備份目錄
      2016-04-27_07-30-48 
      [[email protected] ~]# innobackupex --apply-log /extrabackup/2016-04-27_07-30-48/  #指定備份檔案的目錄
      
      #一般情況下下面三行結尾代表成功*****************
      InnoDB: Starting shutdown...
      InnoDB: Shutdown completed; log sequence number 369661462
      160427 07:40:11 completed OK!
      
      [[email protected] ~]# cd /extrabackup/2016-04-27_07-30-48/
      [[email protected] 2016-04-27_07-30-48]# ls -hl  #檢視備份檔案
      total 31M
      -rw-r----- 1 root root  386 Apr 27 07:30 backup-my.cnf
      drwx------ 2 root root 4.0K Apr 27 07:30 employees
      -rw-r----- 1 root root  18M Apr 27 07:40 ibdata1
      -rw-r--r-- 1 root root 5.0M Apr 27 07:40 ib_logfile0
      -rw-r--r-- 1 root root 5.0M Apr 27 07:40 ib_logfile1
      drwx------ 2 root root 4.0K Apr 27 07:30 mysql
      drwx------ 2 root root 4.0K Apr 27 07:30 performance_schema
      drwx------ 2 root root 4.0K Apr 27 07:30 test
      -rw-r----- 1 root root   27 Apr 27 07:30 xtrabackup_binlog_info
      -rw-r--r-- 1 root root   29 Apr 27 07:40 xtrabackup_binlog_pos_innodb
      -rw-r----- 1 root root  117 Apr 27 07:40 xtrabackup_checkpoints
      -rw-r----- 1 root root  470 Apr 27 07:30 xtrabackup_info
      -rw-r----- 1 root root 2.0M Apr 27 07:40 xtrabackup_logfile
      
      
    2. 恢復資料

      [[email protected] ~]# rm -rf /data/*   #刪除資料檔案
      
      ***不用啟動資料庫也可以還原*************
      
      [[email protected] ~]# innobackupex --copy-back /extrabackup/2016-04-27_07-30-48/   #恢復資料, 記清使用方法
      
      #########我們這裡是編譯安裝的mariadb所以需要做一些操作##########
      [[email protected] data]# killall mysqld
      
      [[email protected] ~]# chown -R mysql:mysql ./* 
      [[email protected] ~]# ll /data/      #資料恢復
      total 28704
      -rw-rw---- 1 mysql mysql    16384 Apr 27 07:43 aria_log.00000001
      -rw-rw---- 1 mysql mysql       52 Apr 27 07:43 aria_log_control
      -rw-rw---- 1 mysql mysql 18874368 Apr 27 07:43 ibdata1
      -rw-rw---- 1 mysql mysql  5242880 Apr 27 07:43 ib_logfile0
      -rw-rw---- 1 mysql mysql  5242880 Apr 27 07:43 ib_logfile1
      -rw-rw---- 1 mysql mysql      264 Apr 27 07:43 mysql-bin.000001
      -rw-rw---- 1 mysql mysql       19 Apr 27 07:43 mysql-bin.index
      -rw-r----- 1 mysql mysql     2166 Apr 27 07:43 node1.anyisalin.com.err
      
      
      [[email protected] data]# service mysqld restart
      MySQL server PID file could not be found!                  [FAILED]
      Starting MySQL..                                           [  OK  ]
      
      MariaDB [(none)]> SHOW DATABASES;  #檢視資料庫, 已經恢復
      +--------------------+
      | Database           |
      +--------------------+
      | information_schema |
      | employees          |
      | mysql              |
      | performance_schema |
      | test               |
      +--------------------+
      
    3. 增量備份

      #########建立連兩個資料庫以供測試#####################
      MariaDB [(none)]> CREATE DATABASE TEST1;
      Query OK, 1 row affected (0.00 sec)
      
      MariaDB [(none)]> CREATE DATABASE TEST2;
      Query OK, 1 row affected (0.00 sec)
      
      [[email protected] ~]# innobackupex --incremental /extrabackup/ --incremental-basedir=/extrabackup/2016-04-27_07-30-48/ 
      
      [[email protected] ~]# ls /extrabackup/2016-04-27_07-57-22/ #檢視備份檔案
      total 96
      -rw-r----- 1 root root   386 Apr 27 07:57 backup-my.cnf
      drwx------ 2 root root  4096 Apr 27 07:57 employees
      -rw-r----- 1 root root 49152 Apr 27 07:57 ibdata1.delta
      -rw-r----- 1 root root    44 Apr 27 07:57 ibdata1.meta
      drwx------ 2 root root  4096 Apr 27 07:57 mysql
      drwx------ 2 root root  4096 Apr 27 07:57 performance_schema
      drwx------ 2 root root  4096 Apr 27 07:57 test
      drwx------ 2 root root  4096 Apr 27 07:57 TEST1
      drwx------ 2 root root  4096 Apr 27 07:57 TEST2
      -rw-r----- 1 root root    21 Apr 27 07:57 xtrabackup_binlog_info
      -rw-r----- 1 root root   123 Apr 27 07:57 xtrabackup_checkpoints
      -rw-r----- 1 root root   530 Apr 27 07:57 xtrabackup_info
      -rw-r----- 1 root root  2560 Apr 27 07:57 xtrabackup_logfile
      
      [[email protected] ~]# innobackupex --apply-log --redo-only /extrabackup/2016-04-27_07-30-48/
      [[email protected] ~]# innobackupex --apply-log --redo-only /extrabackup/2016-04-27_07-30-48/ --incremental-dir=/extrabackup/2016-04-27_07-5
      7-22/
      
    4. 恢復資料

      [[email protected] ~]# rm -rf /data/*   #刪除資料
      
      [[email protected] ~]# innobackupex --copy-back /extrabackup/2016-04-27_07-30-48/     #整理增量備份之後可以直接通過全量備份還原
      
      [[email protected] ~]# chown -R mysql.mysql /data/
      

總結

備份方法 備份速度 恢復速度 便捷性 功能 一般用於
cp 一般、靈活性低 很弱 少量資料備份
mysqldump 一般、可無視儲存引擎的差異 一般 中小型資料量的備份
lvm2快照 一般、支援幾乎熱備、速度快 一般 中小型資料量的備份
xtrabackup 較快 較快 實現innodb熱備、對儲存引擎有要求 強大 較大規模的備份