日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

学会用各种方式备份MySQL数据库

發(fā)布時間:2025/3/19 数据库 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 学会用各种方式备份MySQL数据库 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

?

?

目錄

前言

為什么需要備份數(shù)據(jù)?

數(shù)據(jù)的備份類型

MySQL備份數(shù)據(jù)的方式

備份需要考慮的問題

設計合適的備份策略

實戰(zhàn)演練

使用cp進行備份

使用mysqldump+復制BINARY LOG備份

使用lvm2快照備份數(shù)據(jù)

使用Xtrabackup備份

總結(jié)


前言

我們試著想一想, 在生產(chǎn)環(huán)境中什么最重要?如果我們服務器的硬件壞了可以維修或者換新, 軟件問題可以修復或重新安裝, 但是如果數(shù)據(jù)沒了呢?這可能是最恐怖的事情了吧, 我感覺在生產(chǎn)環(huán)境中應該沒有什么比數(shù)據(jù)跟更為重要. 那么我們該如何保證數(shù)據(jù)不丟失、或者丟失后可以快速恢復呢?只要看完這篇, 大家應該就能對MySQL中實現(xiàn)數(shù)據(jù)備份和恢復能有一定的了解。

為什么需要備份數(shù)據(jù)?

其實在前言中也大概說明了為什么要備份數(shù)據(jù), 但是我們還是應該具體了解一下為什么要備份數(shù)據(jù)

在生產(chǎn)環(huán)境中我們數(shù)據(jù)庫可能會遭遇各種各樣的不測從而導致數(shù)據(jù)丟失, 大概分為以下幾種.

  • 硬件故障

  • 軟件故障

  • 自然災害

  • 黑客攻擊

  • 誤操作 (占比最大)

所以, 為了在數(shù)據(jù)丟失之后能夠恢復數(shù)據(jù), 我們就需要定期的備份數(shù)據(jù), 備份數(shù)據(jù)的策略要根據(jù)不同的應用場景進行定制, 大致有幾個參考數(shù)值, 我們可以根據(jù)這些數(shù)值從而定制符合特定環(huán)境中的數(shù)據(jù)備份策略

  • 能夠容忍丟失多少數(shù)據(jù)

  • 恢復數(shù)據(jù)需要多長時間

  • 需要恢復哪一些數(shù)據(jù)

數(shù)據(jù)的備份類型

數(shù)據(jù)的備份類型根據(jù)其自身的特性主要分為以下幾組

  • 完全備份

  • 部分備份

    完全備份指的是備份整個數(shù)據(jù)集( 即整個數(shù)據(jù)庫 )、部分備份指的是備份部分數(shù)據(jù)集(例如: 只備份一個表)

而部分備份又分為以下兩種

  • 增量備份

  • 差異備份

    增量備份指的是備份自上一次備份以來(增量或完全)以來變化的數(shù)據(jù); 特點: 節(jié)約空間、還原麻煩?
    差異備份指的是備份自上一次完全備份以來變化的數(shù)據(jù)?特點: 浪費空間、還原比增量備份簡單

示意圖

?

MySQL備份數(shù)據(jù)的方式

在MySQl中我們備份數(shù)據(jù)一般有幾種方式

  • 熱備份

  • 溫備份

  • 冷備份

    熱備份指的是當數(shù)據(jù)庫進行備份時,?數(shù)據(jù)庫的讀寫操作均不是受影響?
    溫備份指的是當數(shù)據(jù)庫進行備份時,?數(shù)據(jù)庫的讀操作可以執(zhí)行, 但是不能執(zhí)行寫操作?
    冷備份指的是當數(shù)據(jù)庫進行備份時,?數(shù)據(jù)庫不能進行讀寫操作, 即數(shù)據(jù)庫要下線

MySQL中進行不同方式的備份還要考慮存儲引擎是否支持

  • MyISAM?

    ?熱備 ×

    ?溫備 √

    ?冷備 √

  • InnoDB

    ?熱備 √

    ?溫備 √

    ?冷備 √

    我們在考慮完數(shù)據(jù)在備份時, 數(shù)據(jù)庫的運行狀態(tài)之后還需要考慮對于MySQL數(shù)據(jù)庫中數(shù)據(jù)的備份方式

    物理備份一般就是通過tar,cp等命令直接打包復制數(shù)據(jù)庫的數(shù)據(jù)文件達到備份的效果?
    邏輯備份一般就是通過特定工具從數(shù)據(jù)庫中導出數(shù)據(jù)并另存?zhèn)浞?/strong>(邏輯備份會丟失數(shù)據(jù)精度)

    • 物理備份

    • 邏輯備份

備份需要考慮的問題

定制備份策略前, 我們還需要考慮一些問題

我們要備份什么?

一般情況下, 我們需要備份的數(shù)據(jù)分為以下幾種

  • 數(shù)據(jù)

  • 二進制日志, InnoDB事務日志

  • 代碼(存儲過程、存儲函數(shù)、觸發(fā)器、事件調(diào)度器)

  • 服務器配置文件

備份工具

這里我們列舉出常用的幾種備份工具?
mysqldump?: 邏輯備份工具, 適用于所有的存儲引擎, 支持溫備、完全備份、部分備份、對于InnoDB存儲引擎支持熱備?
cp, tar 等歸檔復制工具: 物理備份工具, 適用于所有的存儲引擎, 冷備、完全備份、部分備份?
lvm2 snapshot: 幾乎熱備, 借助文件系統(tǒng)管理工具進行備份?
mysqlhotcopy: 名不副實的的一個工具, 幾乎冷備, 僅支持MyISAM存儲引擎?
xtrabackup: 一款非常強大的InnoDB/XtraDB熱備工具, 支持完全備份、增量備份, 由percona提供

設計合適的備份策略

針對不同的場景下, 我們應該制定不同的備份策略對數(shù)據(jù)庫進行備份, 一般情況下, 備份策略一般為以下三種

  • 直接cp,tar復制數(shù)據(jù)庫文件

  • mysqldump+復制BIN LOGS

  • lvm2快照+復制BIN LOGS

  • xtrabackup

以上的幾種解決方案分別針對于不同的場景

  • 如果數(shù)據(jù)量較小, 可以使用第一種方式, 直接復制數(shù)據(jù)庫文件

  • 如果數(shù)據(jù)量還行, 可以使用第二種方式, 先使用mysqldump對數(shù)據(jù)庫進行完全備份, 然后定期備份BINARY LOG達到增量備份的效果

  • 如果數(shù)據(jù)量一般, 而又不過分影響業(yè)務運行, 可以使用第三種方式, 使用lvm2的快照對數(shù)據(jù)文件進行備份, 而后定期備份BINARY LOG達到增量備份的效果

  • 如果數(shù)據(jù)量很大, 而又不過分影響業(yè)務運行, 可以使用第四種方式, 使用xtrabackup進行完全備份后, 定期使用xtrabackup進行增量備份或差異備份

  • 實戰(zhàn)演練

    使用cp進行備份

    我們這里使用的是使用yum安裝的mysql-5.1的版本, 使用的數(shù)據(jù)集為從網(wǎng)絡上找到的一個員工數(shù)據(jù)庫

    查看數(shù)據(jù)庫的信息

    mysql> SHOW DATABASES; ? ?#查看當前的數(shù)據(jù)庫, 我們的數(shù)據(jù)庫為employees +--------------------+ | Database ? ? ? ? ? | +--------------------+ | information_schema | | employees ? ? ? ? ?| | mysql ? ? ? ? ? ? ?| | test ? ? ? ? ? ? ? | +--------------------+ 4 rows in set (0.00 sec)mysql> USE employees; Database changed mysql> SHOW TABLES; ? ? ? ? #查看當前庫中的表 +---------------------+ | Tables_in_employees | +---------------------+ | departments ? ? ? ? | | dept_emp ? ? ? ? ? ?| | dept_manager ? ? ? ?| | employees ? ? ? ? ? | | salaries ? ? ? ? ? ?| | titles ? ? ? ? ? ? ?| +---------------------+ 6 rows in set (0.00 sec)mysql> SELECT COUNT(*) FROM employees; ? #由于篇幅原因, 我們這里只看一下employees的行數(shù)為300024 +----------+ | COUNT(*) | +----------+ | ? 300024 | +----------+ 1 row in set (0.05 sec)

    向數(shù)據(jù)庫施加讀鎖

    mysql> FLUSH TABLES WITH READ LOCK; ? ?#向所有表施加讀鎖 Query OK, 0 rows affected (0.00 sec)

    備份數(shù)據(jù)文件

    [root@node1 ~]# mkdir /backup ? #創(chuàng)建文件夾存放備份數(shù)據(jù)庫文件 [root@node1 ~]# cp -a /var/lib/mysql/* /backup ? ? #保留權限的拷貝源數(shù)據(jù)文件 [root@node1 ~]# ls /backup ? #查看目錄下的文件 employees ?ibdata1 ?ib_logfile0 ?ib_logfile1 ?mysql ?mysql.sock ?test

    模擬數(shù)據(jù)丟失并恢復

    [root@node1 ~]# rm -rf /var/lib/mysql/* ? ?#刪除數(shù)據(jù)庫的所有文件 [root@node1 ~]# service mysqld restart ? #重啟MySQL, 如果是編譯安裝的應該不能啟動, 如果rpm安裝則會重新初始化數(shù)據(jù)庫mysql> SHOW DATABASES; ? ?#因為我們是rpm安裝的, 連接到MySQL進行查看, 發(fā)現(xiàn)數(shù)據(jù)丟失了! +--------------------+ | Database ? ? ? ? ? | +--------------------+ | information_schema | | mysql ? ? ? ? ? ? ?| | test ? ? ? ? ? ? ? | +--------------------+ 3 rows in set (0.00 sec)[root@node1 ~]# rm -rf /var/lib/mysql/* ? ?#這一步可以不做 [root@node1 ~]# cp -a /backup/* /var/lib/mysql/ ? ?#將備份的數(shù)據(jù)文件拷貝回去 [root@node1 ~]# service mysqld restart ?#重啟MySQL#重新連接數(shù)據(jù)并查看mysql> SHOW DATABASES; ? ?#數(shù)據(jù)庫已恢復 +--------------------+ | Database ? ? ? ? ? | +--------------------+ | information_schema | | employees ? ? ? ? ?| | mysql ? ? ? ? ? ? ?| | test ? ? ? ? ? ? ? | +--------------------+ 4 rows in set (0.00 sec)mysql> USE employees; ? ? ?mysql> SELECT COUNT(*) FROM employees; ? ?#表的行數(shù)沒有變化 +----------+ | COUNT(*) | +----------+ | ? 300024 | +----------+ 1 row in set (0.06 sec)##完成

    使用mysqldump+復制BINARY LOG備份

    我們這里使用的是使用yum安裝的mysql-5.1的版本, 使用的數(shù)據(jù)集為從網(wǎng)絡上找到的一個員工數(shù)據(jù)庫

    我們通過mysqldump進行一次完全備份, 再修改表中的數(shù)據(jù), 然后再通過binary log進行恢復?二進制日志需要在mysql配置文件中添加 log_bin=on 開啟

    mysqldump命令介紹

    mysqldump是一個客戶端的邏輯備份工具, 可以生成一個重現(xiàn)創(chuàng)建原始數(shù)據(jù)庫和表的SQL語句, 可以支持所有的存儲引擎, 對于InnoDB支持熱備

    官方文檔介紹

    #基本語法格式shell> mysqldump [options] db_name [tbl_name ...] ? ?恢復需要手動CRATE DATABASES shell> mysqldump [options] --databases db_name ... ? 恢復不需要手動創(chuàng)建數(shù)據(jù)庫 shell> mysqldump [options] --all-databases ? ? ? ? ? 恢復不需要手動創(chuàng)建數(shù)據(jù)庫其他選項:-E, --events: 備份事件調(diào)度器-R, --routines: 備份存儲過程和存儲函數(shù)--triggers: 備份表的觸發(fā)器; --skip-triggers --master-date[=value] ?1: 記錄為CHANGE MASTER TO 語句、語句不被注釋2: 記錄為注釋的CHANGE MASTER TO語句基于二進制還原只能全庫還原--flush-logs: 日志滾動鎖定表完成后執(zhí)行日志滾動

    查看數(shù)據(jù)庫的信息

    mysql> SHOW DATABASES; ? ?#查看當前的數(shù)據(jù)庫, 我們的數(shù)據(jù)庫為employees +--------------------+ | Database ? ? ? ? ? | +--------------------+ | information_schema | | employees ? ? ? ? ?| | mysql ? ? ? ? ? ? ?| | test ? ? ? ? ? ? ? | +--------------------+ 4 rows in set (0.00 sec)mysql> USE employees; Database changed mysql> SHOW TABLES; ? ? ? ? #查看當前庫中的表 +---------------------+ | Tables_in_employees | +---------------------+ | departments ? ? ? ? | | dept_emp ? ? ? ? ? ?| | dept_manager ? ? ? ?| | employees ? ? ? ? ? | | salaries ? ? ? ? ? ?| | titles ? ? ? ? ? ? ?| +---------------------+ 6 rows in set (0.00 sec)mysql> SELECT COUNT(*) FROM employees; ? #由于篇幅原因, 我們這里只看一下employees的行數(shù)為300024 +----------+ | COUNT(*) | +----------+ | ? 300024 | +----------+ 1 row in set (0.05 sec)

    使用mysqldump備份數(shù)據(jù)庫

    [root@node1 ~]# mysql -e 'SHOW MASTER STATUS' ? #查看當前二進制文件的狀態(tài), 并記錄下position的數(shù)字 +------------------+----------+--------------+------------------+ | File ? ? ? ? ? ? | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000003 | ? ? ?106 | ? ? ? ? ? ? ?| ? ? ? ? ? ? ? ? ?| +------------------+----------+--------------+------------------+[root@node1 ~]# mysqldump --all-databases --lock-all-tables ?> backup.sql ? #備份數(shù)據(jù)庫到backup.sql文件中mysql> CREATE DATABASE TEST1; ? #創(chuàng)建一個數(shù)據(jù)庫 Query OK, 1 row affected (0.00 sec)mysql> SHOW MASTER STATUS; ? #記下現(xiàn)在的position +------------------+----------+--------------+------------------+ | File ? ? ? ? ? ? | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000003 | ? ? ?191 | ? ? ? ? ? ? ?| ? ? ? ? ? ? ? ? ?| +------------------+----------+--------------+------------------+ 1 row in set (0.00 sec)[root@node1 ~]# cp /var/lib/mysql/mysql-bin.000003 /root ?#備份二進制文件 [root@node1 ~]# service mysqld stop ? #停止MySQL [root@node1 ~]# rm -rf /var/lib/mysql/* ? #刪除所有的數(shù)據(jù)文件 [root@node1 ~]# service mysqld start ? ?#啟動MySQL, 如果是編譯安裝的應該不能啟動(需重新初始化), 如果rpm安裝則會重新初始化數(shù)據(jù)庫mysql> SHOW DATABASES; ? #查看數(shù)據(jù)庫, 數(shù)據(jù)丟失! +--------------------+ | Database ? ? ? ? ? | +--------------------+ | information_schema | | mysql ? ? ? ? ? ? ?| | test ? ? ? ? ? ? ? | +--------------------+ 3 rows in set (0.00 sec)mysql> SET sql_log_bin=OFF; ? #暫時先將二進制日志關閉 ? Query OK, 0 rows affected (0.00 sec)mysql> source backup.sql ?#恢復數(shù)據(jù),所需時間根據(jù)數(shù)據(jù)庫時間大小而定mysql> SET sql_log_bin=ON; 開啟二進制日志mysql> SHOW DATABASES; ? #數(shù)據(jù)庫恢復, 但是缺少TEST1 +--------------------+ | Database ? ? ? ? ? | +--------------------+ | information_schema | | employees ? ? ? ? ?| | mysql ? ? ? ? ? ? ?| | test ? ? ? ? ? ? ? | +--------------------+ 4 rows in set (0.00 sec)[root@node1 ~]# mysqlbinlog --start-position=106 --stop-position=191 mysql-bin.000003 | mysql employees #通過二進制日志增量恢復數(shù)據(jù)mysql> SHOW DATABASES; ? ?#現(xiàn)在TEST1出現(xiàn)了! +--------------------+ | Database ? ? ? ? ? | +--------------------+ | information_schema | | TEST1 ? ? ? ? ? ? ?| | employees ? ? ? ? ?| | mysql ? ? ? ? ? ? ?| | test ? ? ? ? ? ? ? | +--------------------+ 5 rows in set (0.00 sec)#完成

    使用lvm2快照備份數(shù)據(jù)

    做實驗之前我們先回顧一下lvm2-snapshot的知識

    LVM快照簡單來說就是將所快照源分區(qū)一個時間點所有文件的元數(shù)據(jù)進行保存,如果源文件沒有改變,那么訪問快照卷的相應文件則直接指向源分區(qū)的源文件,如果源文件發(fā)生改變,則快照卷中與之對應的文件不會發(fā)生改變??煺站碇饕糜谳o助備份文件。 這里只簡單介紹,點擊查看詳細介紹

    部署lvm環(huán)境

    添加硬盤; 這里我們直接實現(xiàn)SCSI硬盤的熱插拔, 首先在虛擬機中添加一塊硬盤, 不重啟[root@node1 ~]# ls /dev/sd* ? #只有以下幾塊硬盤, 但是我們不重啟可以讓系統(tǒng)識別新添加的硬盤 /dev/sda ?/dev/sda1 ?/dev/sda2[root@node1 ~]# echo '- - -' > /sys/class/scsi_host/host0/scan [root@node1 ~]# echo '- - -' > /sys/class/scsi_host/host1/scan [root@node1 ~]# echo '- - -' > /sys/class/scsi_host/host2/scan [root@node1 ~]# ls /dev/sd* ? ?#看!sdb識別出來了 /dev/sda ?/dev/sda1 ?/dev/sda2 ?/dev/sdb[root@node1 ~]# fdisk /dev/sdb ? #分區(qū) 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 toswitch off the mode (command 'c') and change display units tosectors (command 'u').Command (m for help): n Command actione ? extendedp ? 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): +15GCommand (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 [root@node1 ~]# partx -a /dev/sdb BLKPG: Device or resource busy error adding partition 1##創(chuàng)建邏輯卷 [root@node1 ~]# pvcreate /dev/sdb1Physical volume "/dev/sdb1" successfully created [root@node1 ~]# vgcreate myvg /dev/sdb1 Volume group "myvg" successfully created [root@node1 ~]# lvcreate -n mydata -L 5G myvg Logical volume "mydata" created.[root@node1 ~]# mkfs.ext4 /dev/mapper/myvg-mydata ? #格式化 [root@node1 ~]# mkdir /lvm_data [root@node1 ~]# mount /dev/mapper/myvg-mydata /lvm_data ?#掛載到/lvm_data[root@node1 ~]# vim /etc/my.cnf ? ?#修改mysql配置文件的datadir如下datadir=/lvm_data[root@node1 ~]# service mysqld restart ?#重啟MySQL####重新導入employees數(shù)據(jù)庫########略過####

    查看數(shù)據(jù)庫的信息

    mysql> SHOW DATABASES; ? ?#查看當前的數(shù)據(jù)庫, 我們的數(shù)據(jù)庫為employees +--------------------+ | Database ? ? ? ? ? | +--------------------+ | information_schema | | employees ? ? ? ? ?| | mysql ? ? ? ? ? ? ?| | test ? ? ? ? ? ? ? | +--------------------+ 4 rows in set (0.00 sec)mysql> USE employees; Database changed mysql> SHOW TABLES; ? ? ? ? #查看當前庫中的表 +---------------------+ | Tables_in_employees | +---------------------+ | departments ? ? ? ? | | dept_emp ? ? ? ? ? ?| | dept_manager ? ? ? ?| | employees ? ? ? ? ? | | salaries ? ? ? ? ? ?| | titles ? ? ? ? ? ? ?| +---------------------+ 6 rows in set (0.00 sec)mysql> SELECT COUNT(*) FROM employees; ? #由于篇幅原因, 我們這里只看一下employees的行數(shù)為300024 +----------+ | COUNT(*) | +----------+ | ? 300024 | +----------+ 1 row in set (0.05 sec)

    創(chuàng)建快照卷并備份

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

    恢復數(shù)據(jù)

    [root@node1 lvm_snap]# rm -rf /lvm_data/* [root@node1 ~]# service mysqld start ? ?#啟動MySQL, 如果是編譯安裝的應該不能啟動(需重新初始化), 如果rpm安裝則會重新初始化數(shù)據(jù)庫mysql> SHOW DATABASES; ? #查看數(shù)據(jù)庫, 數(shù)據(jù)丟失! +--------------------+ | Database ? ? ? ? ? | +--------------------+ | information_schema | | mysql ? ? ? ? ? ? ?| | test ? ? ? ? ? ? ? | +--------------------+ 3 rows in set (0.00 sec)[root@node1 ~]# cd /lvm_data/ [root@node1 lvm_data]# rm -rf * #刪除所有文件 [root@node1 lvm_data]# tar xf /tmp/mysqlback.tar ? ? #解壓備份數(shù)據(jù)庫到此文件夾 [root@node1 lvm_data]# ls ?#查看當前的文件 employees ?ibdata1 ?ib_logfile0 ?ib_logfile1 ?mysql ?mysql-bin.000001 ?mysql-bin.000002 ?mysql-bin.000003 ?mysql-bin.index ?testmysql> SHOW DATABASES; ?#數(shù)據(jù)恢復了 +--------------------+ | Database ? ? ? ? ? | +--------------------+ | information_schema | | employees ? ? ? ? ?| | mysql ? ? ? ? ? ? ?| | test ? ? ? ? ? ? ? | +--------------------+ 4 rows in set (0.00 sec)##完成

    使用Xtrabackup備份

    為了更好地演示, 我們這次使用mariadb-5.5的版本, 使用xtrabackup使用InnoDB能夠發(fā)揮其最大功效, 并且InnoDB的每一張表必須使用單獨的表空間, 我們需要在配置文件中添加?innodb_file_per_table = ON?來開啟

    下載安裝xtrabackup

    我們這里通過wget percona官方的rpm包進行安裝 [root@node1 ~]# wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.3.4/binary/redhat/6/x86_64/percona-xtrabackup-2.3.4-1.el6.x86_64.rpm ? [root@node1 ~]# yum localinstall percona-xtrabackup-2.3.4-1.el6.x86_64.rpm ? #需要EPEL源

    xtrabackup介紹

    Xtrabackup是由percona提供的mysql數(shù)據(jù)庫備份工具,據(jù)官方介紹,這也是世界上惟一一款開源的能夠?qū)nnodb和xtradb數(shù)據(jù)庫進行熱備的工具。特點:

  • 備份過程快速、可靠;

  • 備份過程不會打斷正在執(zhí)行的事務;

  • 能夠基于壓縮等功能節(jié)約磁盤空間和流量;

  • 自動實現(xiàn)備份檢驗;

  • 還原速度快;

  • 摘自馬哥的文檔

    xtrabackup實現(xiàn)完全備份

    我們這里使用xtrabackup的前端配置工具innobackupex來實現(xiàn)對數(shù)據(jù)庫的完全備份

    使用innobackupex備份時, 會調(diào)用xtrabackup備份所有的InnoDB表, 復制所有關于表結(jié)構(gòu)定義的相關文件(.frm)、以及MyISAMMERGE、CSVARCHIVE表的相關文件, 同時還會備份觸發(fā)器和數(shù)據(jù)庫配置文件信息相關的文件, 這些文件會被保存至一個以時間命名的目錄.

    備份過程

    [root@node1 ~]# mkdir /extrabackup ?#創(chuàng)建備份目錄 [root@node1 ~]# innobackupex --user=root /extrabackup/ #備份數(shù)據(jù) ###################提示complete表示成功*********************[root@node1 ~]# ls /extrabackup/ ?#看到備份目錄 2016-04-27_07-30-48

    一般情況, 備份完成后, 數(shù)據(jù)不能用于恢復操作, 因為備份的數(shù)據(jù)中可能會包含尚未提交的事務或已經(jīng)提交但尚未同步至數(shù)據(jù)文件中的事務。因此, 此時的數(shù)據(jù)文件仍不一致, 所以我們需要”準備”一個完全備份

    [root@node1 ~]# innobackupex --apply-log /extrabackup/2016-04-27_07-30-48/ ?#指定備份文件的目錄#一般情況下下面三行結(jié)尾代表成功***************** InnoDB: Starting shutdown... InnoDB: Shutdown completed; log sequence number 369661462 160427 07:40:11 completed OK![root@node1 ~]# cd /extrabackup/2016-04-27_07-30-48/ [root@node1 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

    恢復數(shù)據(jù)

    [root@node1 ~]# rm -rf /data/* ? #刪除數(shù)據(jù)文件***不用啟動數(shù)據(jù)庫也可以還原*************[root@node1 ~]# innobackupex --copy-back /extrabackup/2016-04-27_07-30-48/ ? #恢復數(shù)據(jù), 記清使用方法#########我們這里是編譯安裝的mariadb所以需要做一些操作########## [root@node1 data]# killall mysqld[root@node1 ~]# chown -R mysql:mysql ./* [root@node1 ~]# ll /data/ ? ? ?#數(shù)據(jù)恢復 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[root@node1 data]# service mysqld restart MySQL server PID file could not be found! ? ? ? ? ? ? ? ? ?[FAILED] Starting MySQL.. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [ ?OK ?]MariaDB [(none)]> SHOW DATABASES; ?#查看數(shù)據(jù)庫, 已經(jīng)恢復 +--------------------+ | Database ? ? ? ? ? | +--------------------+ | information_schema | | employees ? ? ? ? ?| | mysql ? ? ? ? ? ? ?| | performance_schema | | test ? ? ? ? ? ? ? | +--------------------+ 5 rows in set (0.00 sec

    增量備份

    #########創(chuàng)建連兩個數(shù)據(jù)庫以供測試##################### 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)[root@node1 ~]# innobackupex --incremental /extrabackup/ --incremental-basedir=/extrabackup/2016-04-27_07-30-48/ [root@node1 ~]# 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

    BASEDIR指的是完全備份所在的目錄,此命令執(zhí)行結(jié)束后,innobackupex命令會在/extrabackup目錄中創(chuàng)建一個新的以時間命名的目錄以存放所有的增量備份數(shù)據(jù)。另外,在執(zhí)行過增量備份之后再一次進行增量備份時,其--incremental-basedir應該指向上一次的增量備份所在的目錄。

    需要注意的是,增量備份僅能應用于InnoDB或XtraDB表,對于MyISAM表而言,執(zhí)行增量備份時其實進行的是完全備份。

    整理增量備份

    [root@node1 ~]# innobackupex --apply-log --redo-only /extrabackup/2016-04-27_07-30-48/ [root@node1 ~]# innobackupex --apply-log --redo-only /extrabackup/2016-04-27_07-30-48/ --incremental-dir=/extrabackup/2016-04-27_07-5 7-22/

    恢復數(shù)據(jù)

    [root@node1 ~]# rm -rf /data/* ? #刪除數(shù)據(jù)[root@node1 ~]# innobackupex --copy-back /extrabackup/2016-04-27_07-30-48/ ? ? #整理增量備份之后可以直接通過全量備份還原[root@node1 ~]# chown -R mysql.mysql /data/ [root@node1 ~]# ls /data/ -l total 28732 -rw-rw---- 1 mysql mysql ? ? 8192 Apr 27 08:05 aria_log.00000001 -rw-rw---- 1 mysql mysql ? ? ? 52 Apr 27 08:05 aria_log_control drwx------ 2 mysql mysql ? ? 4096 Apr 27 08:05 employees -rw-r----- 1 mysql mysql 18874368 Apr 27 08:05 ibdata1 -rw-r----- 1 mysql mysql ?5242880 Apr 27 08:05 ib_logfile0 -rw-r----- 1 mysql mysql ?5242880 Apr 27 08:05 ib_logfile1 drwx------ 2 mysql mysql ? ? 4096 Apr 27 08:05 mysql -rw-rw---- 1 mysql mysql ? ? ?245 Apr 27 08:05 mysql-bin.000001 -rw-rw---- 1 mysql mysql ? ? ? 19 Apr 27 08:05 mysql-bin.index -rw-r----- 1 mysql mysql ? ? 1812 Apr 27 08:05 node1.anyisalin.com.err -rw-rw---- 1 mysql mysql ? ? ? ?5 Apr 27 08:05 node1.anyisalin.com.pid drwx------ 2 mysql mysql ? ? 4096 Apr 27 08:05 performance_schema drwx------ 2 mysql mysql ? ? 4096 Apr 27 08:05 test drwx------ 2 mysql mysql ? ? 4096 Apr 27 08:05 TEST1 drwx------ 2 mysql mysql ? ? 4096 Apr 27 08:05 TEST2 -rw-r----- 1 mysql mysql ? ? ? 29 Apr 27 08:05 xtrabackup_binlog_pos_innodb -rw-r----- 1 mysql mysql ? ? ?530 Apr 27 08:05 xtrabackup_infoMariaDB [(none)]> SHOW DATABASES; ?#數(shù)據(jù)還原 +--------------------+ | Database ? ? ? ? ? | +--------------------+ | information_schema | | TEST1 ? ? ? ? ? ? ?| | TEST2 ? ? ? ? ? ? ?| | employees ? ? ? ? ?| | mysql ? ? ? ? ? ? ?| | performance_schema | | test ? ? ? ? ? ? ? | +--------------------+ 7 rows in set (0.00 sec)#關于xtrabackup還有很多強大的功能沒有敘述、有興趣可以去看官方文檔

    總結(jié)

    備份方法備份速度恢復速度便捷性功能一般用于
    cp一般、靈活性低很弱少量數(shù)據(jù)備份
    mysqldump一般、可無視存儲引擎的差異一般中小型數(shù)據(jù)量的備份
    lvm2快照一般、支持幾乎熱備、速度快一般中小型數(shù)據(jù)量的備份
    xtrabackup較快較快實現(xiàn)innodb熱備、對存儲引擎有要求強大較大規(guī)模的備份

    其實我們還可以通過Master-Slave Replication?進行數(shù)據(jù)備份、由于本文篇幅過長、遂放在下篇和大家分享

    作者水平很低, 如果有錯誤及時指出, 如果你覺得本文寫的好請點一波贊~(≧▽≦)/~?

    總結(jié)

    以上是生活随笔為你收集整理的学会用各种方式备份MySQL数据库的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。