冷備份:關閉數據、中止業務 溫備份:加鎖備份 熱備份:在先備份,不會影響到也正常運行
邏輯備份:基於SQL語句的備份 (1)mysqldump建庫、建表、數據插入 (2)基於二進制日誌:數據庫的全部變化類的操做 (3)基於複製的備份:將二進制日誌實時傳送到另外一臺機器而且恢復 物理備份 (1)xtrabackup進行物理備份 (2)拷貝數據文件(冷備)
(1)mysqldump mysql原生自帶很好用的邏輯備份工具 (2)mysqlbinlog 實現binlog備份的原生態命令 (3)xtrabackup precona公司開發的性能很高的物理備份工具
優勢:邏輯備份工具,都是SQL語句,都是文本格式,便於查看和編輯,更便於壓縮
缺點:備份效率較慢前端
-A, --all-databases:全庫備份 -B:增長建庫(create)及「use庫」的語句,能夠直接接多個庫名,同時 備份多個庫***** -B 庫1 庫2 -R, --routines:備份存儲過程和函數數據 --triggers: 備份觸發器數據 -F, --flush-logs :刷新binlog日誌,爲了方便未來二進制日誌截取時的起點 --master-data={1|2}:告訴你備份時刻的binlog位置,通常咱們選擇使用2,以註釋的方式記錄二進制日誌位置 --single-transaction:對innodb引擎進行熱備
全庫備份 [root@db02 backup]# mysqldump -uroot -poldboy -A > /backup/mysql.sql 單庫備份 [root@db02 backup]# mysqldump -B oldboy > /backup/oldboy.sql [root@db02 backup]# mysqldump oldboy > /backup/oldboy.sql -B,增長建庫(create)及「use庫」的語句,在未來恢復時,不須要手工進行建庫和use 不加-B,須要恢復時,先建立庫,use庫下再進行恢復 另外,-B選項還能夠實現,同時備份多個庫,備份到同一個文件中 [root@db02 backup]#mysqldump -uroot -p123 -B lufei oldboy>/backup/lufei_oldboy.sql 如下例子,若是不加-B,去備份,他的功能是備份路飛數據庫下的oldboy表 mysqldump -uroot -p123 lufei oldboy>/backup/lufei_oldboy.sql mysqldump 庫1 表1 表2 表3 >庫1.sql 完整備份語句 [root@db02 backup]# mysqldump -uroot -poldboy -A -R --triggers --master-data=2 --single-transaction |gzip >/backup/all_$(date +%F).sql.gz 壓縮備份語句 mysqldump -uroot -p123 -A -R --triggers --master-data=2 --single-transaction |gzip >/backup/all_$(date +%F).sql.gz 使用source命令進行恢復: mysql>set sql_log_bin=0; #臨時關閉寫入binlog寫文件 mysql> source /backup/all.sql; 進行恢復
背景環境: 正在運行的網站系統,mysql數據庫,數據量25G,日業務增量10-15M。 備份方式: 天天23:00點,計劃任務調用mysqldump執行全備腳本 故障時間點: 上午10點,誤刪除了一個表 如何恢復? ------- 思路: 一、斷開業務,防止對數據庫二次傷害,掛出維護頁面 二、搭建備用庫,恢復全備 三、截取昨天晚上23:00以後到上午10點誤刪除操做以前的二進制日誌 四、恢復到備用庫,驗證數據可用性和完整性 五、兩種方案恢復前端應用 5.1 備用庫導出誤刪除的表,導入到生產庫,開啓業務 5.2 直接將應用切割到備用庫,替代生產庫,開啓業務
解決過程:mysql
模擬故障並恢復: 一、原始數據: mysql> create database oldboy; mysql> use oldboy mysql> create table t1 (id int,name varchar(20)); mysql> insert into t1 values (1,'zhang3'); mysql> insert into t1 values (2,'li4'); mysql> insert into t1 values (3,'wang5'); 二、模擬前一天晚上23:00全備 mysqldump -A -R --triggers --master-data=2 --single-transaction |gzip >/backup/all_$(date +%F).sql.gz 三、模擬白天(23:00-10:00)業務對數據的修改 mysql> insert into t1 values (4,'zhang33'); mysql> insert into t1 values (5,'li44'); mysql> insert into t1 values (6,'wang54'); 四、模擬故障 drop table t1; 五、恢復 (1)準備全備,並獲取到備份文件中的binlog的截取起點 [root@db02 mysql]# gunzip all_2019-04-26.sql.gz -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=660; (2)截取二進制日誌 show binlog events in 'my-bin.000001'; ----》drop以前的position爲885 [root@db02 mysql]# mysqlbinlog --start-position=660 --stop-position=885 mysql-bin.000001 > /tmp/mysql.sql (3)恢復全備+binlog mysql> set sql_log_bin=0; mysql> source /backup/all_2019-04-26.sql; mysql> source /tmp/mysql.sql
percona公司的備份工具,性能比較高。物理備份工具。 特色: 物理備份工具,在同級數據量基礎上,都要比邏輯備份性能要好的多。 特別是在數據量比較大的時候,體現的更加明顯。 備份方式: 一、拷貝數據文件 二、拷貝數據頁 備份原理(innodb): 一、對於innodb表,能夠實現熱備 (1)在數據還有修改操做的時刻,直接將數據文件中的數據頁備份 此時,備份走的數據對於當前mysql來說是不一致。 (2) 將備份過程當中的redo和undo一併備走。 (3)爲了恢復的時候,只要保證備份出來的數據頁LSN能和redo LSN匹配, 未來恢復的就是一致的數據。redo應用和undo的應用。 二、對與myisam表,實現自動鎖表拷貝文件。
安裝依賴 wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL 下載軟件包進行安裝 wget https://www.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.13/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.13-1.el7.x86_64.rpm yum -y install percona-xtrabackup-24-2.4.13-1.el7.x86_64.rpm
全量備份 innobackupex --user=root --password=oldboy --socket=/application/mysql/tmp/mysql.sock --no-timestamp /server/bakcup/full --user:數據庫帳號 --password:數據庫密碼 --socket:mysql的mysql.sock文件位置 --no-timestamp:以本身指定的文件位置進行備份 全量恢復案例: 一、恢復數據前的準備(合併xtabackup_log_file和備份的物理文件) innobackupex --apply-log --use-memory=32M /server/backup/full/ 二、模擬故障 pkill mysqld # 關閉數據庫 ps -ef|grep mysql 刪除數據庫 cd /application/mysql/data rm -rf * 三、恢復數據庫 cp -a /server/backup/full/* /application/mysql/data 或者 innobackupex --copy-back /server/backup/full/ 報錯:這是由於在my.cnf配置文件裏沒有添加datadir數據文件路徑,添加便可 [root@db02 data]# innobackupex --copy-back /server/bakcup/full/ xtrabackup: recognized server arguments: --log_bin=/data/mysql/mysql-bin --innodb_file_per_table=1 xtrabackup: recognized client arguments: --log_bin=/data/mysql/mysql-bin --innodb_file_per_table=1 190426 10:57:47 innobackupex: Starting the copy-back operation IMPORTANT: Please check that the copy-back run completes successfully. At the end of a successful copy-back run innobackupex prints "completed OK!". innobackupex version 2.4.13 based on MySQL server 5.7.19 Linux (x86_64) (revision id: 3e7ca7c) Error: datadir must be specified. 解決: vim /etc/my.cnf datadir=/application/mysql/data 四、啓動數據庫 /etc/init.d/mysqld start mysql -e "show database;"
背景:
-某大型網站,mysql數據庫,數據量500G,每日更新量100M-200M
備份策略:
-xtrabackup,每週六0:00進行全備,週一到週五及週日00:00進行增量備份。
故障場景:
–週三下午2點出現數據庫意外刪除表操做。
如何恢復?sql
全備 innobackupex --user=root --password=123 --no-timestamp /backup/full/ 週一數據變化進行增量備份 innobackupex --user=root --password=123 --incremental --no-timestamp --incremental-basedir=/backup/full/ /backup/inc1 週二數據變化進行增量備份 innobackupex --user=root --password=123 --incremental --no-timestamp --incremental-basedir=/backup/inc1 /backup/inc2 模擬數據破壞 修改數據以後,不當心把表刪除了 進行數據恢復,將全部增量備份合併到一個備份中 innobackupex --apply-log --redo-only /backup/full innobackupex --apply-log --redo-only --incremental-dir=/backup/inc1 /backup/full innobackupex --apply-log --incremental-dir=/backup/inc2 /backup/full innobackupex --apply-log /backup/full 關閉數據庫,刪除data中的數據 pkill mysqld cd /application/mysql/data rm -rf * 截取binlog文件 mysqlbinlog --start-position=244 --stop-position=930 mysql-bin.000005 > /tmp/mysql.sql 使用innobackup恢復 innobackup --copy-back /backup/full /etc/init.d/mysqld start mysql> source /tmp/msyql.sql
爲解決爲了恢復1G表,須要將整個全備恢復數據庫
drop table t1; 須要建立表結構與原來表結構如出一轍的表 create table t1 (id int,name varchar(20)); 刪除原來t1表中的ibd文件 alter table t1 discard tablespace; 複製備份中的ibd文件 cd /application/mysql/data/oldboy cp /backup/full/oldboy/t1.ibd ./ 修改所屬組 chown -R mysql.mysql * 導入ibd文件到數據庫中 alter table t1 import tablespace;