Linux九陰真經之九陰白骨爪殘卷12(備份還原)
一、備份策略
1、備份的類型
- 類型1:
- 熱備份:讀寫不受影響(MyISAM不支持熱備,InnoDB支持熱備)
- 溫備份:僅可以執行讀操作
- 冷備份:離線備份,讀寫操作均中止
- 類型2:
- 物理備份:復制數據文件進行備份,占用較多的空間,速度快
- 邏輯備份:將數據導出至文本文件中,占用空間少,速度慢,可能丟失精度
- 類型3:
- 完全備份:備份全部數據
- 增量備份:僅備份上次完全備份或增量備份以後變化的數據,備份較快,還原復雜
- 差異備份:僅備份上次完全備份以來變化的數據,備份較慢,還原簡單
2、備份需要考慮的因素
- 溫備的持鎖多久,在鎖狀態的情況下無法寫入數據
- 備份產生的負載,要調空閑的時間備份
- 備份過程的時長,數據量大的時候時間會很長,要選擇合適的方案
- 恢復過程的時長,備份數據需要即時測試
3、備份的目標
- 數據庫數據,每個表空間單獨存放
- 二進制日誌,需要和數據分開存儲
- InnoDB的事務日誌
- 存儲過程、存儲函數、觸發器或事件調度器等
- 服務器的配置文件:/etc/my.cnf
4、備份工具
- mysqldump工具:邏輯備份工具,適用所有存儲引擎溫備;支持完全或部分備份;對InnoDB存儲引擎支持熱備;Schema(數據庫的定義)和數據存儲在一起。
用法: shell> mysqldump [options] db_name [tbl_name ...] shell> mysqldump [options] --databases db_name ... shell> mysqldump [options] --all-databases 選項: -A:備份所有庫 -B db_name1,[db_name2,...]:備份指定庫 -E:備份相關的所有event scheduler -R:備份所有存儲過程和存儲函數 --triggers:備份表相關觸發器,默認啟用,用--skip-triggers,不備份觸發器 --master-data={1|2}: 1:所備份的數據之前加一條記錄為CHANGE MASTER TO語句,非註釋,不指定默認為12:記錄為註釋的CHANGE MASTER TO語句,註意:此選項會自動關閉--lock-tables功能,自動打開--lock-all-tables功能(除非開啟--single-transaction) -F:備份前滾動日誌,鎖定表完成後,執行flush logs命令,生成新的二進制日誌文件,配合-A時,會導致刷新多次數據庫,在同一時刻執行轉儲和日誌刷新,則應同時使用--flush-logs和-x,--master-data或-single-transaction,此時只刷新一次;建議:和-x,--master-data或 --single-transaction一起使用 --compact 去掉註釋,適合調試,生產不使用 -d:只備份表結構 -t:只備份數據,不備份create table -n:不備份create database,可被-A或-B覆蓋 --flush-privileges:備份前刷新授權表,備份mysql庫或相關時需要使用 -f:忽略SQL錯誤,繼續執行 --hex-blob:使用十六進制符號轉儲二進制列(例如,“abc”變為0x616263),受影響的數據類型包括BINARY, VARBINARY,BLOB,BIT -q:不緩存查詢,直接輸出,加快備份速度
MyISAM備份選項:支持溫備;不支持熱備,所以必須先鎖定要備份的庫,而後啟動備份操作
-x,--lock-all-tables:加全局讀鎖,鎖定所有庫的所有表,同時加--single-transaction或--lock-tables選項會關閉此選項功能,註意:數據量大時,可能會導致長時間無法並發訪問數據庫
-l,--lock-tables:對於需要備份的每個數據庫,在啟動備份之前分別鎖定其所有表,默認為on,--skip-lock-tables選項可禁用,對備份MyISAM的多個庫,可能會造成數據不一致
InnoDB備份選項:支持熱備,可用溫備但不建議用
--single-transaction:此選項Innodb中推薦使用,不適用MyISAM,此選項會開始備份前,先執
行START TRANSACTION指令開啟事務此選項通過在單個事務中轉儲所有表來創建一致的快照。僅適用於存儲在支持多版本控制的存儲引擎中的表(目前只有InnoDB可以); 轉儲不保證與其他存儲引擎保持一致。
? 在進行單事務轉儲時,要確保有效的轉儲文件(正確的表內容和二進制日誌位置),需要保證沒有其他連接使用以下語句:ALTER TABLE,DROP TABLE,RENAME TABLE,TRUNCATE TABLE
? 此選項和 --lock-tables(此選項隱含提交掛起的事務)選項是相互排斥備份大型表時,建議將--single-transaction選項和--quick結合一起使用
InnoDB建議備份策略: mysqldump –uroot –A –F –E –R --single-transaction --master-data=1 --flush-privileges --triggers --hex-blob >$BACKUP/fullbak_$BACKUP_TIME.sql MyISAM建議備份策略: mysqldump –uroot –A –F –E –R –x --master-data=1 --flush-privileges --triggers --hex-blob >$BACKUP/fullbak_$BACKUP_TIME.sql
- xtrabackup工具:由Percona提供支持對InnoDB做熱備(物理備份)的工具,支持完全備份、增量備份
由Percona公司提供的mysql數據庫備份工具,開源的能夠對innodb和xtradb數據庫進行熱備的工具;
xtrabackup 是用來備份 InnoDB 表的,不能備份非 InnoDB 表;
innobackupex 腳本用來備份非 InnoDB 表,同時會調用 xtrabackup 命令來備份 InnoDB 表,還會和 MySQL Server 發送命令進行交互,如加全局讀鎖(FTWRL)、獲取位點(SHOW SLAVE STATUS)等。即innobackupex是在xtrabackup 之上做了一層封裝實現的;
雖然目前一般不用 MyISAM 表,只是 MySQL 庫下的系統表是 MyISAM 的,因此備份基本都通過 innobackupex 命令進行;
xtrabackup版本升級到2.4後,相比之前的2.1有了比較大的變化:innobackupex 功能全部集成到 xtrabackup 裏面,只有一個 binary程序,另外為了兼容考慮,innobackupex作為 xtrabackup 的軟鏈接,即xtrabackup現在支持非Innodb表備份,並且Innobackupex在下一版本中移除,建議通過xtrabackup替換innobackupex。
參考手冊:https://www.percona.com/doc/percona-xtrabackup/LATEST/index.html
使用innobakupex備份時,其會調用xtrabackup備份所有的InnoDB表,復制所有關於表結構定義的相關文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相關文件,同時還會備份觸發器和數據庫配置信息相關的文件。這些文件會被保存至一個以時間命名的目錄中,在備份時,innobackupex還會在備份目錄中創建如下文件:
1)xtrabackup_checkpoints:備份類型(如完全或增量)、備份狀態(如是否已經為prepared狀態)和LSN(日誌序列號)範圍信息,每個InnoDB頁(通常為16k大小)都會包含一個日誌序列號,即LSN。LSN是整個數據庫系統的系統版本號,每個頁面相關的LSN能夠表明此頁面最近是如何發生改變的;
2)xtrabackup_binlog_info:MySQL服務器當前正在使用的二進制日誌文件及至備份這一刻為止二進制日誌事件的位置;
3)xtrabackup_info:innobackupex工具執行時的相關信息;
4)backup-my.cnf:備份命令用到的配置選項信息;
5)xtrabackup_logfile:備份生成的日誌文件。
用法: innobackupex --user=DBUSER --password=DBUSERPASS /path/to/BACKUP-DIR/ 選項: --user:該選項表示備份賬號 --password:該選項表示備份的密碼 --host:該選項表示備份數據庫的地址 --databases:該選項接受的參數為數據名,如果要指定多個數據庫,彼此間需要以空格隔開;如:"xtra_test dba_test",同時,在指定某數據庫時,也可以只指定其中的某張表。如:"mydatabase.mytable"。該選項對innodb引擎表無效,還是會備份所有innodb表 --defaults-file:該選項指定從哪個文件讀取MySQL配置,必須放在命令行第一個選項位置 --incremental:該選項表示創建一個增量備份,需要指定--incremental-basedir --incremental-basedir:該選項指定為前一次全備份或增量備份的目錄,與--incremental同時使用 --incremental-dir:該選項表示還原時增量備份的目錄 --include=name:指定表名,格式:databasename.tablename --apply-log:一般情況下,在備份完成後,數據尚且不能用於恢復操作,因為備份的數據中可能會包含尚未提交的事務或已經提交但尚未同步至數據文件中的事務。因此,此時數據文件仍處理不一致狀態。此選項作用是通過回滾未提交的事務及同步已經提交的事務至數據文件使數據文件處於一致性狀態 --use-memory:該選項表示和--apply-log選項一起使用,prepare 備份的時候,xtrabackup做crash recovery分配的內存大小,單位字節。也可(1MB,1M,1G,1GB),推薦1G --export:表示開啟可導出單獨的表之後再導入其他Mysql中 --redo-only:此選項在prepare base full backup,往其中merge增量備份時候使用 --copy-back:做數據恢復時將備份數據文件拷貝到MySQL服務器的datadir --move-back:這個選項與--copy-back相似,唯一的區別是它不拷貝文件,而是移動文件到目的地。這個選項移除backup文件,用時候必須小心。使用場景:沒有足夠的磁盤空間同事保留數據文件和Backup副本 註意:
1)datadir目錄必須為空。除非指定innobackupex --force-non-empty-directorires選項指定,否則--copy-backup選項不會覆蓋;
2)在restore之前,必須shutdown MySQL實例,不能將一個運行中的實例restore到datadir目錄中;
3)由於文件屬性會被保留,大部分情況下需要在啟動實例之前將文件的屬主改為mysql,chown -R mysql:mysql /data/mysqldb
- mysqlbackup工具:熱備份,MySQL Enterprise Edition組件
- mysqlhotcopy工具:幾乎冷備,僅適用於MyISAM存儲引擎
- 基於lvm快照備份:幾乎熱備,需要在拍快照前鎖表
- tar + cp 等歸檔復制工具備份:完全冷備
三、備份方案
一、cp + tar == 物理冷備(不推薦)
1、備份:
~]# mkdir /backup ~]# systemctl stop mariadb #停止服務 ~]# tar Jcf /backup/mariadb_all.tar.xz /var/lib/mysql/ #打包壓縮 backup]# systemctl start mariadb
2、還原:
~]# systemctl stop mariadb ~]# rm /var/lib/mysql/ -rf #將損壞的庫刪除 ~]# cd /backup/ backup]# tar xf mariadb_all.tar.xz #解壓打包的數據庫文件 backup]# cp -av var/lib/mysql/ /var/lib/ #還原 backup]# systemctl start mariadb #啟動服務,恢復成功
二、備份
1、創建一個邏輯卷
[root@centos7 ~]#fdisk /dev/sda
n 新建磁盤
回車 默認選項
+15G 給15G大小
t 列出類型
8e 選擇8e LVM邏輯卷
w 保存退出
[root@centos7 ~]#partprobe 同步
[root@centos7 ~]#lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 200G 0 disk
├─sda1 8:1 0 1G 0 part /boot
├─sda2 8:2 0 50G 0 part /
├─sda3 8:3 0 30G 0 part /date
├─sda4 8:4 0 512B 0 part
├─sda5 8:5 0 2G 0 part [SWAP]
└─sda6 8:6 0 15G 0 part
sr0 11:0 1 8.1G 0 rom /mnt/cdrom
2、創建物理卷組,將pv加入邏輯卷組
[root@centos7 ~]#pvcreate /dev/sda6 #創建物理卷 Physical volume "/dev/sda6" successfully created. [root@centos7 ~]#vgcreate vg0 /dev/sda6 #創建邏輯卷組vg0,將物理卷加入邏輯卷組 Volume group "vg0" successfully created
3、創建2個邏輯卷,分別存放數據庫文件和二進制文件並格式化
[root@centos7 ~]#lvcreate -L 5G -n mysql vg0
Logical volume "mysql" created.
[root@centos7 ~]#lvcreate -L 3G -n binlog vg0
Logical volume "binlog" created.
[root@centos7 ~]#mkfs.xfs /dev/vg0/mysql
[root@centos7 ~]#mkfs.xfs /dev/vg0/binlog
4、將這個盤設置為自動掛載 ,並修改配置文件
vim /etc/fstab
[mysqld] log_bin=/date/binlog/mysql-bin(生成文件名為mysql-bin前綴,後面是 00001.....) #設置為啟用二進制文件並制定目錄 datadir=/date/mysql #指定數據庫目錄 socket=/var/lib/mysql/mysql.sock # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 # Settings user and group are ignored when systemd is used.
4、重啟mariadb服務,給數據庫臨時加鎖
MariaDB [(none)]> flush tables with read lock; #加鎖
MariaDB [(none)]> show master logs; #查看日誌
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 30343 |
| mysql-bin.000002 | 1038814 |
| mysql-bin.000003 | 7655 |
+------------------+-----------+
5、刷新日誌,分別出之前日誌(最後一個為最新刷新的日誌)
MariaDB [(none)]> flush logs; Query OK, 0 rows affected (0.01 sec) MariaDB [(none)]> show master logs; +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000001 | 30343 | | mysql-bin.000002 | 1038814 | | mysql-bin.000003 | 7698 | | mysql-bin.000004 | 245 | #最新日誌 +------------------+-----------+
6、對數據庫文件創建快照,有了備份,就可以給數據庫解鎖了
[root@centos7 ~]#lvcreate -L 1G -n mysql-kz -s -pr /dev/vg0/mysql Using default stripesize 64.00 KiB.
[root@centos7 ~]#mysql
MariaDB [(none)]> unlock tables; #解鎖
Query OK, 0 rows affected (0.00 sec)
7、將快照掛載到mnt下 , 然後將mnt下的所有內容復制到事先創建好的backup文件夾內
[root@centos7 ~]#mount -o nouuid,norecovery /dev/vg0/mysql-kz /mnt #掛載快照 mount: /dev/mapper/vg0-mysql--kz is write-protected, mounting read-only
[root@centos7 ~]#mkdir /backup
[root@centos7 ~]#cp -av /mnt/* /backup/ #備份文件
取消掛載 , 移除快照
[root@centos7 ~]#umount /mnt [root@centos7 ~]#lvremove /dev/vg0/mysql-kz Do you really want to remove active logical volume vg0/mysql-kz? [y/n]: y Logical volume "mysql-kz" successfully removed
8、到這裏所有備份都已經 完成,接下來要恢復數據庫了;在這之前,假如我們先對數據庫進行簡單的修改,新建一個數據庫db2
[root@centos7 ~]#mysql MariaDB [(none)]> create database db2; MariaDB [(none)]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | db2 | | hellodb | | mysql | | performance_schema | | test | +--------------------+
接下來 我們要先停止數據庫服務,然後刪庫
[root@centos7 ~]#systemctl stop mariadb [root@centos7 ~]#rm -rf /date/mysql/*
當我們發現數據庫被刪,或硬盤損壞都已經修好之後, 就開始恢復數據了,首先將我們備份的文件復制到 mysql目錄內
[root@centos7 ~]#cp -av /backup/* /date/mysql [root@centos7 ~]#systemctl start mariadb
這時 我們發現 mysql 可以用了,但是 在之前創建的數據庫db2 並沒有恢復
MariaDB [(none)]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | hellodb | | mysql | | performance_schema | | test | +--------------------+ 並沒有db2 數據庫
9、我們可以用數據庫的二進制文件進行恢復,但恢復之前要對數據庫進行加鎖,防止用戶在恢復過程中對數據庫修改。
MariaDB [(none)]> flush tables with read lock; Query OK, 0 rows affected (0.00 sec) MariaDB [(none)]> show master logs; +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000001 | 30343 | | mysql-bin.000002 | 1038814 | | mysql-bin.000003 | 7698 | | mysql-bin.000004 | 458 | | mysql-bin.000005 | 245 | #此時最新日誌為5了 +------------------+-----------+
10、我們進到 /date/binlog 目錄內, 將二進制文件導出 到backup 文件夾內 ,為了防止用戶訪問,可以禁止網絡連接,寫在配置文件內
[root@centos7 binlog]#mysqlbinlog --start-position=458 mysql-bin.000004 > /backup/bin.sql #這裏的000004二進制文件表示 000004以後 的所有修改數據都備份,但僅僅針對於000004 這一個二進制文件 [root@centos7 binlog]#mysqlbinlog mysql-bin.000005 >> /backup/bin.sql #將000005以後二進制文件的文件 追加到 一個新的文件內
[mysqld]
skip_networking
log_bin=/date/binlog/mysql-bin
datadir=/date/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
重啟服務,檢查一下3306端口 是否打開, 沒有則為關閉,可以隨意恢復了
[root@centos7 binlog]#systemctl restart mariadb [root@centos7 binlog]#ss -tnl State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 *:111 *:* LISTEN 0 128 *:22 *:* LISTEN 0 128 127.0.0.1:631 *:* LISTEN 0 128 :::111 :::* LISTEN 0 128 :::22 :::* LISTEN 0 128 ::1:631 :::* [root@centos7 binlog]#
11、我們將最新的二進制日誌導入數據庫,然後將網絡開啟,重啟服務
[root@centos7 binlog]#mysql < /backup/bin.sql [root@centos7 binlog]#vim /etc/my.cnf
刪除 skip_networking 刪除即可
[root@centos7 binlog]#systemctl restart mariadb
測試一下 看看是否恢復成功
MariaDB [(none)]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | db2 | #db2 已經恢復 | hellodb | | mysql | | performance_schema | | test | +--------------------+
Linux九陰真經之九陰白骨爪殘卷12(備份還原)