Mysql備份方案
方案一:mysqldump+binlog: ( 推薦)
完全備份,通過備份二進制日誌實現增量備份
方案二: xtrabackup:
對InnoDB:熱備,支持完全備份和增量備份
對MyISAM:溫備,只支持完全備份
方案三: lvm2快照+binlog:
幾乎熱備,物理備份
具體操作如下:方案一解析:
mysqldump+binlog
命令的語法格式
mysqldump [OPTIONS] database [tables]:備份單個庫,或庫指定的一個或多個表
mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2DB3...]:備份一個或多個庫
mysqldump [OPTIONS] --all-databases [OPTIONS]:備份所有庫
其他選項
-x, --lock-all-tables:鎖定所有表
-l, --lock-tables:鎖定備份的表
--single-transaction:啓動一個大的單一事務實現備份
-C, --compress:壓縮傳輸
-E, --events:備份指定庫的事件調度器
-R, --routines:備份存儲過程和存儲函數
--triggers:備份觸發器
--master-data={0|1|2}
0:不記錄
1:記錄CHANGE MASTER TO語句;此語句未被註釋
2:記錄爲註釋語句
-F,--flush-logs:鎖定表之後執行flushlogs命令 (刷新日誌)
詳細過程:
- 關閉防火牆和selinux,啓動數據庫mariadb
- 準備備份目錄:
- 創建目錄:mkdir -pv /backup/binlog
- 修改權限:chown -R mysql.mysql /backup/
- 準備備份數據庫及表
- 進入數據庫:mysql -uroot -p
- 創建數據庫:create database magedu 然後使用該數據庫:use magedu
- 創建表:create table M26(id int not null,name char(20) );
- 進行完全備份:
- 備份整個庫:mysqldump --all-databases --lock-all-tables --flush-log --master-data=2 >/backup/`date +%F_%T` -all.sql
- 備份某一個庫:mysqldump -uroot -p123456 --databases magedu --lock-all-tables --flush-log -hlocalhost --master-data=2 >/backup/`date +%F_%T`-magedu.sql;查看一下:ls /backup/
5.向表裏插入數據:
查看一下
6.進行增量備份,備份二進制日誌:mysqlbinlog --start-position=315 --stop-position=639 /var/lib/mysql/bin- log.000003 > /backup/binlog-`date +%F_%T`.sql
查看:ls /backup/
繼續插入數據,在沒備份的情況下刪除數據庫,模擬誤操作
7.數據恢復,由於最後我們沒有備份就刪除了數據庫,所以我們首先需要保護最後的二進制日誌,
- 查看刪除操作之前的position值:最後的二進制文件:mysqlbinlog /var/lib/mysql/bin-log.000003
8.將最後操作的二進制日誌備份 :mysqlbinlog --start-position=639 --stop-position=835 /var/lib/mysql/bin-log.000003 > /backup/binlog-`date +%F_%T`.sql
9.導入之前的備份:
10.查看數據庫及數據:
方案二解析:
xtrabackup
Xtrabackup是由percona提供的mysql數據庫備份工具,據官方介紹,是一款開源能夠對innodb和xtradb數據庫進行熱備的工具。
特點:
(1)備份過程快速、可靠
(2)備份過程不會打斷正在執行的事務
(3)能夠基於壓縮等功能節約磁盤空間和流量
(4)自動實現備份檢驗
(5)還原速度快
安裝
[root@MariaDB ~]# yum installpercona-xtrabackup-2.2.3-4982.el6.x86_64.rpm -y
創建最小權限備份用戶 : grant reload,lock tables,replicationclient on *.* to 'fulanqi'@'localhost' identified by '123';
完全備份
[root@MariaDB ~]# innobackupex --user=fulanqi --password=123 /backup/
須知(這一步可以不做):備份的這庫可以直接當數據庫用:
修改一下權限,就可以啓動了:
試一下需要改回來哦
增量備份
每個InnoDB的頁面都會包含一個存儲信息,每當相關的數據發生改變,相關
的頁面的存儲就會自動增長。這正是InnoDB表可以進行增量備份的基礎,即
innobackupex通過備份上次完全備份之後發生改變的頁面來實現
innobackupex命令會在備份目錄中創建一個新的以時間命名的目錄以存放所
有的增量備份數據。另外,在執行過增量備份之後再一次進行增量備份時,其
–incremental-basedir應該指向上一次的增量備份所在的目錄
注:增量備份僅能應用於InnoDB或XtraDB表,對於MyISAM表而言,執行增量備份時其實進行的是完全備份
添加數據
增量備份
[root@MariaDB ~]# innobackupex --user=fulanqi --password=123 --incremental /backup/--incremental-basedir=/backup/2017-11-21_10-52-43
數據恢復準備
一般情況下,在備份完成後,數據尚且不能用於恢復操作,因爲備份的數據中
可能會包含尚未提交的事務或已經提交但尚未同步至數據文件中的事務。因此
,此時數據文件仍處理不一致狀態。“準備”的主要作用正是通過回滾未提交
的事務及同步已經提交的事務至數據文件也使得數據文件處於一致性狀態
“準備”(prepare)增量備份與整理完全備份有着一些不同,尤其要注意的是:
(1)需要在每個備份(包括完全和各個增量備份)上,將已經提交的事務進行“重放”。“重放”之後,所有的備份數據將合併到完全備份上。
(2)基於所有的備份將未提交的事務進行“回滾”。
誤操作:不小心把/var/lib/mysql/下的某數據庫刪了
數據恢復準備
執行操作:
# innobackupex --apply-log --redo-only BASE-DIR
接着執行(增量):
# innobackupex --apply-log --redo-only BASE-DIR--incrementaldir=INCREMENTAL-DIR-1
恢復階段,還原數據
[root@MariaDB ~]# innobackupex --copy-back /backup/2017-11-21_10-52-43/
修改權限:[root@MariaDB ~]# cd /var/lib/mysql chownmysql.mysql . -R
[root@MariaDB ~]# systemctl restart mariadb
方案三解析:
lvm2快照+binlog
mysql引擎,架構
倆引擎:Innodb支持事物鎖機安表,MyISAM不支持事物,鎖機按行
引擎作用把表中數據按照特點寫進硬盤中,每個引擎的特點不同
- 劃分邏輯卷:
- 先添加一塊硬盤:
- 掃描一下:echo '- - -' > /sys/class/scsi_host/host2/scan
上面的掃描方法不行的話換成::echo '- - -' > /sys/class/scsi_host/host0/scan
查看一下:fdisk -l
- 劃分區:
- 磁盤:fdisk /dev/sdb
改成邏輯卷並保存
- 重讀分區表:partprobe
- 讓內核讀取一下:partx -a /dev/sdb
- 查看一下:fdisk -l
- 添加邏輯卷:pvcreate /dev/sdb1
- 添加捲組:vgcreate myvg /dev/sdb1
- 添加邏輯卷:lvcreate -n mydata -L 5G myvg
- 格式化邏輯卷:mkfs.ext4 /dev/mapper/myvg-mydata
- 掛載:
- 先創建一個目錄(用於掛載):mkdir /bak
- 掛載:mount /dev/mapper/myvg-mydata /bak
- 修改Mysql配置, 使得數據文件在邏輯捲上:
- 停掉mariadb服務:systemctl stop mariadb
- 進入存取數據的目錄:cd /var/lib/mysql
- 移動數據:mv * /bak
- 修改權限:chown mysql.mysql . -R
- 修改配置文件:vim /etc/my.cnf
- 啓動Mysql服務:(7)systemctl start mariadb (6) service mysqld restart
- 創建數據庫, 進行操作,
- 進入數據庫:mysql -uroot -p
- 鎖定表:FLUSH TABLES WITH READ LOCK;
- 現在可以退出數據庫了。
- 創建快照卷lvcreate -L 1G -n mydata-snap -p r -s /dev/mapper/myvgmydata
- 再次進入數據庫,進行解鎖所有表:UNLOCK TABLES;
- 掛載snap:
- 創建目錄:mkdir /snap
- 掛載:mount /dev/myvg/mydata-snap /snap
- 查看:(snap裏面保存的是元數據)
- 打包物理備份:
- 進入該目錄下:cd /snap/
- 打包:tar -cjvf mysql-backup-tar.gz ./*
如果不小心把bak裏面所有東西刪了,則snap下的所有東西也都沒了,可以用剛剛打包的文件恢復:
恢復:
- 先把備份文件移動到/bak目錄下:
- 解壓:
- 啓動數據庫:systemctl restart mariadb
可能會出現錯誤,比如某個日誌文件,刪了就行
查看二進制文件tail
- 驗證數據庫數據是否正確恢復
ok 數據庫備份方案完成,歐耶!!