1. 程式人生 > >資料的備份與恢復、mysqldump的使用

資料的備份與恢復、mysqldump的使用

**

mysqldump備份/恢復

資料庫備份概述 資料備份方式 • 物理備份 – 冷備: cp 、 tar 、 … …

• 邏輯備份 – mysqldump – mysql

資料備份策略 • 完全備份mysqldump – 備份所有資料(一臺伺服器、一個庫、一張表)

• 增量備份 – 備份自上一次備份(包含完全備份、差異備份、增量 備份)之後有變化的資料

• 差異備份 – 備份自上一次完全備份之後有變化的資料 物理備份與恢復 • 備份操作52 – cp -rp /var/lib/mysql/ 資料庫 備份目錄 / 檔名 – tar -zcvf xxx.tar.gz /var/lib/mysql/ 資料庫 /*

[
[email protected]
~]# mkdir /datadir [[email protected] ~]# cp -r /var/lib/mysql /datadir/mysql.bak [[email protected] ~]# scp -r /datadir/mysql.bak/ 192.168.4.51:/root/

• 恢復操作51 – cp -rp 備份目錄 / 檔名 /var/lib/mysql/ – tar -zxvf xxx.tar.gz -C /var/lib/mysql/資料庫名/

[[email protected] ~]# rm -rf /var/lib/mysql
[
[email protected]
~]# systemctl stop mysqld [[email protected] ~]# cp -r /root/mysql.bak/ /var/lib/mysql [[email protected] ~]# chown -R mysql.mysql /var/lib/mysql [[email protected] ~]# systemctl start mysqld [[email protected] ~]# mysql -uroot -p123asd...A

邏輯備份及恢復 • 備份操作(完全) – mysqldump -uroot -p密碼 庫名 > 路徑 /xxx.sql – mysqldump

例:
[[email protected] ~]# mysqldump -uroot -p654321 -A > /datadir/allbak.sql
													//備份所有庫
[[email protected] ~]# mysqldump -uroot -p654321 db5  >  /datadir/db5.sql
													//備份一個庫
[[email protected] ~]# mysqldump -uroot -p654321 db5 t1 > /datadir/db5_t1.sql
													//備份庫中的表
[[email protected]~]# mysqldump -uroot -p123456 -B db5 db55  > /datadir/twodb.sql
												//備份多個庫
[[email protected]~]# ls /datadir/*.sql
[[email protected] ~]# cat /datadir/db5.sql
[[email protected] ~]# scp /datadir/db5_t1.sql  192.168.4.51:/root/
[[email protected] ~]# scp /datadir/twodb.sql  192.168.4.51:/root/

恢復操作(完全) – mysql -uroot -p密碼 庫名 < 路徑/xxx.sql

例:
[[email protected] ~]# mysql -u root -p123asd...A  < /root/twodb.sql
//恢復多個庫,此時不需要指定庫名,因在恢復檔案中有建庫的mysql命令
[[email protected] ~]# mysql -uroot -p123asd...A  db5 <  db5_t1.sql
//恢復庫中的表,此時需要指定庫名,因在恢復檔案中沒有建庫的命令,如果伺服器上沒有庫,
需要先建庫,再恢復
mysql> create database db6;    //連線資料庫服務,建立庫
mysql> use db6;			//進入庫
mysql> source  /root/db5_t1.sql;    //恢復資料
mysql> show tables;    //顯示有t1表

• 源庫名的表示 – --all-databases 或 -A 所有庫 – 資料庫名 單個庫 – 資料庫名 表名 單張表 – -B 資料庫 1 資料庫 2 備份多個庫 • 注意事項 – 無論備份還是恢復,都要驗證使用者及許可權

案例:每週一的半夜23:30 備份資料庫伺服器上的所有的資料到系統的/datadir目錄下使用系統日期做為備份檔名稱

根據自己的工作需要對指令碼內容進行修改,格式如下:
# vim /allbak.sh
.....
......
# chmod  +x  /allback.sh
# crontab -e -u root  
.......

實時增量備份 / 恢復 方法1: 使用binlog日誌檔案實現數庫的增量備份和恢復 binlog日誌 簡介: 二進位制日誌用途及配置方式 1 分析binlog日誌 檢視日誌當前記錄格式 mysql> show variables like ‘binlog_format’; 三種記錄格式:

  1. statement:每一條修改資料的sql命令都會記錄在binlog日誌中
  2. row:不記錄sql語句上下文相關資訊,僅儲存哪條記錄被修改
  3. mixed:是以上兩種格式的混合使用

啟用binlog日誌 採用binlog日誌的好處 — 記錄除查詢之外的所有SQL命令 — 可用於資料恢復 — 配置mysql主從同步的必要條件 [[email protected] ~]# vim /etc/my.cnf server_id=50 //指定id值 log_bin //啟用binlog日誌 binlog_format=“mixed” //修改日誌記錄格式 [[email protected] ~]# systemctl restart mysqld [[email protected] ~]# ls /var/lib/mysql binlog相關檔案 — 主機名-bin.index 記錄已有日誌檔名 — 主機名-bin.000001 二進位制檔案

[[email protected] ~]# mysqlbinlog  /var/log/mysqld/ binlog		//檢視日誌檔案命令
[[email protected] ~]# mysqlbinlog   /var/lib/mysql/client-bin.000001

啟用binlog日誌檔案時,指定儲存位置和日誌名

[[email protected] ~]# vim /etc/my.cnf
log_bin=/logdir/asd
[[email protected] ~]# mkdir /logdir    //建立日誌目錄
[[email protected] ~]# chown mysql  /logdir			//修改所有者為mysql
[[email protected] ~]# systemctl restart mysqld
[[email protected] ~]# ll -d  /logdir/
螢幕輸出:drwxr-xr-x. 2 mysql root 41 10月 20 11:49 /logdir/
[[email protected] ~]# ls /logdir/     //檢視指定的目錄下是否有日誌檔案
asd.000001  asd.index

驗證binlog記錄的資訊 在資料庫伺服器上執行sql命令,檢視日誌檔案是否記錄了查詢之外的sql命令

mysql> select * from  db5.t1;
mysql> desc t1;

2 插入操作:

mysql> insert  into t1 values("bob",11);
mysql> insert into t1 values("jek",16);
mysql> insert into t1 values ("bin",444);

更改操作

mysql> update db5.t1 set age=888  where age=444;
mysql> select * from db5.t1;    //查詢操作
mysql> delete  from db5.t1;    //刪除操作

檢視日誌檔案中sql命令記錄:

[[email protected] ~]# mysqlbinlog /logdir/asd.000001  | grep -i insert 
有輸出
[[email protected] ~]# mysqlbinlog /logdir/asd.000001  | grep -i update
有輸出
[[email protected] ~]# mysqlbinlog /logdir/asd.000001  | grep -i delete
有輸出
[[email protected] ~]# mysqlbinlog /logdir/asd.000001  | grep -i select
[[email protected] ~]# mysqlbinlog /logdir/asd.000001  | grep -i desc
[[email protected] ~]# mysqlbinlog /logdir/asd.000001  | grep -i show

binlog恢復資料 — 使用mysqlbinlog 提取歷史SQL操作 • 使用 mysqlbinlog 工具 – 格式: mysqlbinlog [ 選項 ] binlog 日誌檔名 • 常用選項 – --start-datetime=“yyyy-mm-dd hh:mm:ss” – --stop-datetime=“yyyy-mm-dd hh:mm:ss” – --start-position= 數字(起始位置偏移量) – --stop-position= 數字(結束位置偏移量) 通過位置偏移量恢復資料

[[email protected] ~]# mysqlbinlog --start-datetime='2018-10-20 14:00:00'  /logdir/asd.000001
   									   //通過此命令檢視binlog日誌內容,

**手動找出要恢復資料的起始位置偏移量與結束位置偏移量**

[[email protected] ~]# mysqlbinlog --start-position=219   \
> --stop-position=1268   /logdir/asd.000001   | mysql -uroot -p654321
[[email protected] ~]#  mysql -uroot -p654321
mysql> select * from db5.t1;

通過時間範圍恢復資料

[[email protected] ~]# mysqlbinlog --start-datetime='2018-10-20 14:00:00' /logdir/asd.000001
[[email protected] ~]# mysqlbinlog --start-datetime="2018-10-20 14:05:35"   \
> --stop-datetime="2018-10-20 14:10:53"  /logdir/asd.000001  | mysql -uroot -p654321	
mysql> select * from db5.t1;
在恢復過程中,可以不用指定起始位置,直接指定結束位置

手動建立新的binlog日誌檔案 預設日誌容量大於500M 自動常見新的日誌檔案

顯示當前資料庫正在使用的日誌檔案及偏移量

mysql> show master status;

3 手動生成新的日誌檔案

mysql> flush logs;
[[email protected] ~]# mysql -uroot -p654321 -e 'flush logs';
[[email protected] ~]# mysqldump  -uroot  -p654321  --flush-logs  db5  > /root/db5.sql
[[email protected] ~]# systemctl restart mysqld

清理binlog日誌

  1. 刪除早於指定版本的 binlog日誌 — purge master logs to “binlog檔名”;

    mysql> purge master logs to ‘asd.000001’;

  2. 刪除所有binlog日誌,重新建日誌 — reset master;

    mysql> reset master;

方法2: 使用innobackipex命令實現資料的增量備份和恢復 MYSQL備份工具 常用的MYSQL備份工具

物理備份缺點 — 跨平臺性差 — 備份時間長、冗餘備份、浪費儲存空間 mysqldump 備份缺點 — 效率較低,備份和還原速度慢 — 備份過程中,資料插入和更新操作會被掛起

XtraBackup工具 一款強大的線上熱備份工具 — 備份過程中不鎖庫表,適合生產環境 — 由專業組織Percona提供(改進MySQL分支) 主要含兩個元件 — xtrabackup:C程式,支援InnoDB/XtraDB — innobackupex:以Perl指令碼封裝xtrabackup,還支援MyISAM 安裝percona 下載適配的RPM包並安裝

[[email protected] ~]# rpm -ivh  libev-4.15-1.el6.rf.x86_64.rpm
[[email protected] ~]# yum -y install percona-xtrabackup-24-2.4.7-1.el7.x86_64.rpm 
[[email protected] ~]# rpm -ql  percona-xtrabackup-24

innobackupex基本選項 4 完全備份與恢復 環境準備 1.將預設儲存引擎該為innodb (innodb備份時可以增量備份,myisam即使執行增量的命令進行備份,可實際執行的還是完全備份) 2.重新建庫、表

mysql> create database db5;
mysql> create table db5.a(id int);
mysql> insert into db5.a values(110);

備份

[[email protected] ~]# innobackupex  --user root --password  654321  /allbak  
					//完全備份,會在/allback目錄下使用日期作為檔案儲存的子目錄名
[[email protected] ~]# innobackupex  --user root --password  654321  /allbak  --no-timestamp
					//不用日期命令備份檔案儲存的子目錄名
[[email protected] ~]# ls /allbak/

恢復資料: 1.準備恢復資料 --apply-log 2. 拷貝資料 --copy-back

[[email protected] ~]# systemctl stop mysqld
[[email protected] ~]# rm -rf /var/lib/mysql    //恢復時要求空的庫目錄
[[email protected] ~]# innobackupex --apply-log /allbak //準備恢復資料(回滾日誌)
[[email protected] ~]# innobackupex  --copy-back  /allback   //拷貝資料
[[email protected] ~]# chown -R  mysql:mysql  /var/lib/mysql  //遞迴賦許可權,給mysql賦予目錄許可權
[[email protected] ~]# systemctl start mysqld
[[email protected] ~]# mysql -uroot -p654321
mysql> select * from db5.a

增量備份和恢復——(增量備份時,必須先有一次備份,通常時完全備份) 增量備份:備份上次備份後,所有新產生的資料 –incremental 目錄 指定增量備份檔案儲存目錄 –incremental-basedir=目錄 指定上次備份檔案儲存目錄 完全備份

[[email protected] ~]# innobackupex --user root --password 654321  /fullbak --no-timestamp

完全備份後,繼續向表裡寫入新資料

[[email protected] ~]# mysql -uroot -p654321
mysql> insert  into db5.a values(120);   

增量備份

[[email protected] ~]# innobackupex --user root --password 654321 --incremental  /new1dir  \
> --incremental-basedir=/fullbak  --no-timestamp

第一次增量備份完成後,繼續向表裡寫入新資料

mysql> insert  into db5.a values(119);

第二次增量備份

[[email protected] ~]# innobackupex  --user root --password  654321  --incremental /new2dir \
> --incremental-basedir=/new1dir  --no-timestamp

檢視備份資訊

[[email protected] ~]# ls  /fullbak
[[email protected] ~]# ls /new1dir/
[[email protected] ~]# ls /new2dir/
xtrabackup_checkpoints
[[email protected] ~]# cat  /fullbak/xtrabackup_checkpoints(資料的備份資訊和備份型別)
from_lsn = 0    日誌序列號

增量恢復

  1. 準備恢復資料—— --apply-log
  2. 合併日誌—— --redo-only
  3. 拷貝資料—— --copy-back
  4. 指定增量恢復的目錄名——–incremental-dir=目錄名

刪除資料

[[email protected] ~]# systemctl stop mysqld
[[email protected] ~]# rm -rf /var/lib/mysql
[[email protected] ~]# mkdir /var/lib/mysql

增量恢復資料

[[email protected] ~]# cat /fullabk/xtrabackup_checkpoints//檢視恢復之前的資訊
[[email protected] ~]# innobackupex  --apply-log --redo-only /fullabk
[[email protected] ~]# cat /fullabk/xtrabackup_checkpoints     //檢視恢復資訊
[[email protected] ~]# innobackupex --apply-log --redo-only  /fullabk/  --incremental-dir=/new1dir
[[email protected] ~]# cat /fullabk/xtrabackup_checkpoints
[[email protected] ~]# innobackupex --apply-log  --redo-only /fullabk/ --incremental-dir=/new2dir
[[email protected] ~]# cat /fullabk/xtrabackup_checkpoints

拷貝備份檔案到資料庫目錄下

[[email protected] ~]# innobackupex --copy-back /fullabk/

修改所有者和組為mysql

[[email protected] ~]# ls /var/lib/mysql
[[email protected] ~]# chown -R  mysql:mysql  /var/lib/mysql
[[email protected] ~]# systemctl start mysqld
[[email protected] ~]# mysql -uroot -p654321
mysql> select * from  db5.a;   //檢視恢復的資料
mysql> insert into db5.a  values(212);    繼續儲存新資料(寫多條)

備份新產生的資料

[[email protected] ~]# innobackupex  --user root  --password  654321  --incremental  /dir  \
> --incremental-basedir=/fullabk --no-timestamp  //恢復資料之後的第一次增量備份
[[email protected] ~]# cat /dir/xtrabackup_checkpoints    //檢視備份資訊

恢復完全備份中的某個表 在db5庫下建立第2張表並寫入記錄

mysql> create table db5.b(id int);
mysql> insert into db5.b values(119);   //插入多條

對db5庫做完全備份

[[email protected] ~]# innobackupex --user root --password  123456  --databases='db5'  /db5bak \
> --no-timestamp

檢視備份資訊

[[email protected] ~]# ls /db5bak

刪除db5庫的a表

mysql> drop table db5.a;

單獨恢復a表的步驟 –export 匯出表資訊 刪除表空間 mysql> alter table 庫名.表 discard tablespace; 匯入表空間 mysql> alter table 庫名.表 import tablespace;

1.手動建立表a且表結構要與刪除時的表結構相同

mysql> create  table db5.a(id int);

2.刪除a表的表空間檔案

mysql> alter table db5.a  discard  tablespace;
mysql> select * from db5.a;
[[email protected] ~]# ls /var/lib/mysql/db5

3.匯出表資訊,並拷貝到資料庫目錄下

[[email protected] ~]# innobackupex  --user root --password  123456  --databases="db5"  \
> --apply-log  --export /db5bak
[[email protected] ~]# cp /db5bak/db5/a.{cfg,exp,ibd}  /var/lib/mysql/db5/ 
										//將恢復檔案拷貝到資料庫目錄下
[[email protected] ~]# ls /var/lib/mysql/db5/a.*   //檢視
[[email protected] ~]# chown  mysql:mysql  /var/lib/mysql/db5/a.*   //更該歸屬

4.匯入表資訊 並刪除表資訊檔案

mysql> alter table db5.a  import  tablespace;
mysql> system rm -rf  /var/lib/mysql/db5/a.cfg   //恢復之後刪除表恢復檔案建
mysql> system rm -rf  /var/lib/mysql/db5/a.exp
mysql> system ls  /var/lib/mysql/db5/a.*   //檢視
/var/lib/mysql/db5/a.frm(表結構)  /var/lib/mysql/db5/a.ibd(表空間檔案)

5.查看錶記錄

mysql> select * from db5.a;   //查看錶內容是否恢復