1. 程式人生 > >數據備份與恢復

數據備份與恢復

mysql

數據備份與恢復
一數據備份相關概念
1.1 數據備份的目的? 數據被誤刪除 或 設備損害導致數據丟失 ,是備份文件恢復數據。
1.2數據備份方式?
物理備份: 指定備份庫和表對應的文件
51
cp -r /var/lib/mysql /opt/mysql.bak
cp -r /var/lib/mysql/bbsdb /opt/bbsdb.bak

rm -rf /var/lib/mysql/bbsdb
cp -r /opt/bbsdb.bak /var/lib/mysql/bbsdb
chown -R mysql:mysql /var/lib/mysql/bbsdb
systemctl restart mysqld

pc51 scp /opt/mysql.bak 192.168.4.51:/root/

pc52 rm -rf /var/lib/mysql
cp -r /root/mysql.bak /var/lib/mysql
chown -R mysql:mysql /var/lib/mysql
systemctl restart mysqld

邏輯備份: 在執行備份命令時,根據備份的庫表及數據生成對應的sql命令,把sql存儲到指定的文件裏。

在執行備份命令時,根據已有的庫表記錄,生成對應的sql命令把,sql存儲到指定的文件裏。 當數據丟失時,可以執行保存SQL命令的文件,把數據重新寫回數據庫.

1.3數據備份策略?
完全備份 備份所有數據(一張表的所有數據 一個庫的所有數據 一臺數據庫的所有數據)

備份新產生數據(差異備份 和 增量備份 都備份新產生的數據 )
差異備份 備份自完全備份後,所有新產生的數據。
增量備份 備份自上次備份後,所有新產生的數據。

1.4工作中如何對數據做備份?
1.4.1 選擇備份策略:
完全備份+差異備份
完全備份+增量備份
1.4.2 數據備份時間 數據服務器訪問量少的時候執行備份
1.4.3 數據備份頻率 根據數據產生量,決定備份頻率
1.4.4 備份文件的命名 庫名-日期.sql
1.4.5 備份文件的存儲設置 準備獨立的存儲設備存儲備份文件
1.4.6 如何執行備份 使用周期性計劃任務執行本機腳本
生產環境下執行本分數據的手段
crond +備份腳本(shell python perl ruby lua)

部署mysql主從同步結構實現自動備份

2.1 完全備份數據
]# mkdir -p /mydatabak
]# mysqldump -uroot -p654321 studb > /mydatabak/studb.sql
]# mysqldump -uroot -p654321 db3 user3 > /mydatabak/db3-user3.sql

]#cat /mydatabak/studb.sql
]#cat /mydatabak/db3-user3.sql

2.3 完全恢復數據
]# mysql -uroot -p654321 studb < /mydatabak/studb.sql
]# mysql -uroot -p654321 db3 < /mydatabak/db3-user3.sql

使用source 命令恢復數據
mysql> create database bbsdb;
mysql> use bbsdb;
mysql> source /mydatabak/studb.sql

每周一晚上18:00備份studb庫的所有數據到本機的/dbbak目錄下,備份文件名稱要求如下 日期_庫名.sql。

]#vim /root/bakstudb.sh
#!/bin/bash
day=date +%F
if [ ! -e /dbbak ];then
mkdir /dbbak
fi
mysqldump -uroot -p654321 studb > /dbbak/${day}_studb.sql
:wq
]# chmod +x /root/bakstudb.sh
]#/root/bakstudb.sh
]# ls /dbbak/*.sql

]#crontab -e
00 18 1 /root/bakstudb.sh &> /dev/null
:wq

3.1 啟動mysql數據庫服務的binlog日誌文件 實現實時增量備份
3.1.1 binlog日誌介紹:是mysql數據庫服務日誌文件的一種,默認沒有啟用。記錄除查詢之外的sql命令。
查詢命令例如: select show desc
寫命令例如: insert update delete create drop

3.1.2 啟用binlog日誌
]#vim /etc/my.cnf
[mysqld]
server_id=51
log-bin
binlog-format="mixed"
:wq
]# systemctl restart mysqld

]# ls /var/lib/mysql/主機名-bin.000001
]# cat /var/lib/mysql/主機名-bin.index

3.1.3 查看binlog日誌文件內容
]#mysqlbinlog /var/lib/mysql/mysql51-bin.000001

****可以自定義binlog日誌文件存儲的位置和文件名稱
]#mkdir /mylog
]#chown mysql /mylog
]#setenforce 0

]#vim /etc/my.cnf
[mysqld]
server_id=51
#log-bin
log-bin=/mylog/plj
binlog-format="mixed"
:wq

]# systemctl restart mysqld
]#ls /mylog/plj.*
plj.000001 plj.index

mysqlbinlog 選項 binlog日誌 文件 | mysql -uroot -p密碼

選項
--start-position=起始偏移量 --stop-position=結束偏移量
--start-datetime="yyyy-mm-mm hh:mm:ss" --stop-datetime="yyyy-mm-mm hh:mm:ss"

3.1.4 手動生成新的日誌文件方法
*默認日誌文件大於500M時自動創建新日誌文件

]# systemctl restart mysqld

mysql> flush logs;

]# mysql -uroot -p密碼 -e "flush logs"

]# mysqldump -uroot -p密碼 --flush-logs 庫名 > 目錄/xx.sql

使用一個新的日誌文件 記錄 新創建的webdb庫的初始操作。
mysql> flush logs;
mysql> create database webdb; create table webdb.a(id int);
mysql> insert into webdb.a values(100);
mysql> insert into webdb.a values(101);
mysql> flush logs;
刪除webdb庫,使用 binlog日誌文件恢復webdb庫的數據。
mysql> drop database webdb;

3.1.7 使用binlog日誌恢復數據
]#mysqlbinlog /mylog/plj.000008 | mysql -uroot -p654321

3.1.5 刪除已有的binlog日誌文件

mysql> purge master logs to "binlog文件名;
刪除指定日誌文件之前的日誌文件
mysql> purge master logs to "plj.000005";

mysql> reset master ; 刪除所有的日誌文件重新生成第一個日誌文件
mysql> show master status; 顯示當前正在使用的binlog日誌信息

]#mysqlbinlog 日誌文件名;

3.1.6 binlog日誌記錄sql命令方式
記錄方式有2種: 偏移量 、記錄sql命令執行的時間

指定偏移量範圍選項
--start-position=偏移量的值
--stop-position=偏移量的值

指定時間範圍選項
--start-datetime="yyyy-mm-dd hh:mm:ss"
--stop-position="yyyy-mm-dd hh:mm:ss"
++++++++++++++++++++++++
讀取日誌文件指定範圍內的sql命令恢復數據。
]# mysqlbinlog --start-position=293 --stop-position=1450 plj.000001 | mysql -uroot -

p654321
++++++++++++++++++++++++++++

]#mysqldump -uroot -p654321 --flush-logs db3.user3 > /root/user3.sql

mysql> insert into db3.user3 values("a","b","c");
mysql> insert into db3.user3 values("aa","b","c");
mysql> insert into db3.user3 values("ab","b","c");
mysql> insert into db3.user3 values("ac","b","c");

mysql> delete from db3.users;
mysql> select * from db3.user3;

]#mysql -uroot -p654321 db3 < /root/user3.sql
mysql> select * from db3.user3;

]#mysqlbinlog --start-position=偏移量的值
--stop-position=偏移量的值 日誌文件名 | mysql -uroot -p654321

mysql> select * from db3.user3;
+++++++++++++++++++++++++++++++++
3.2 安裝第3方軟件提供備份命令,對數據做增量備份
軟件介紹 Percona 開源軟件 在線熱備不鎖表 適用於生成環境。

安裝軟件
]# rpm -ivh libev-4.15-1.el6.rf.x86_64.rpm
]# yum -y install perl-DBD-mysql perl-Digest-MD5
]# rpm -ivh percona-xtrabackup-24-2.4.7-1.el7.x86_64.rpm
]# rpm -ql percona-xtrabackup-24

提供2個備份命令
/usr/bin/innobackupex命令集成了命令xtrabackup,所以可以支持MYISAM存儲引擎

/usr/bin/xtrabackup命令僅支持InnoDB和XtraDB存儲引擎的表

innobackupex備份命令的使用格式?
]#innobackupex <選項>
]# man innobackupex

常用選項?
--user 用戶名
--password 密碼
--databases="庫名"
"庫名1 庫名2"
"庫名.表名"
--no-timestamp 不使用時間戳做備份文件的子目錄名

+++++++++++++++innobackupex完全備份 與 完全恢復
]# innobackupex --user root --password 654321 \
--databases="mysql performance_schema sys gamedb" /allbak --no-timestamp

++++++++++++++完全恢復
--copy-back

]# rm -rf /var/lib/mysql
]# mkdir /var/lib/mysql
]# innobackupex --user root --password 654321 --copy-back /allbak
]# chown -R mysql:mysql /var/lib/mysql
]# systemctl restart mysqld
]#mysql -uroot -p654321
mysql> show databases;
mysql> select * from gmaedb.t1;

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
事務日誌文件
LSN 日誌序列號

增量備份的工作過程?
每一個備份目錄下,都有記錄當前目錄備份信息的配置文件
]# cat 備份目錄名/xtrabackup_checkpoints (記錄備份類型 和lsn範圍)

+++++++++innobackupex增量備份與恢復
--incremental 目錄名 #增量備份
--incremental-basedir=目錄名 #增量備份時,指定上一次備份文件存儲的目錄名

先要有一次完全備份 存放目錄 /fullbak
]# innobackupex --user root --password 654321 \
--databases="gamedb mysql performance_schema sys" \
/fullbak --no-timestamp

插入新記錄,執行增量備份 存放目錄 /new1bak
mysql> insert into gamedb.t1 values(8080),(8080);
]# innobackupex --user root --password 654321 \
--databases="gamedb mysql performance_schema sys" \
--incremental /new1dir --incremental-basedir=/fullbak --no-timestamp

插入新記錄,執行增量備份 存放目錄 /new2bak
mysql> insert into gamedb.t1 values(8099),(8099);
]# innobackupex --user root --password 654321 \
--databases="gamedb mysql performance_schema sys" \
--incremental /new2dir --incremental-basedir=/new1dir --no-timestamp

++++++++++++++增量恢復
--apply-log 準備恢復數據
--redo-only 合並日誌
--incremental-dir=目錄名 #增量恢復數據時,指定備份目錄名稱
--copy-back 恢復數據

清空數據庫目錄
]# rm -rf /var/lib/mysql
]# mkdir /var/lib/mysql

準備恢復數據
]# innobackupex --user root --password 654321 \
--databases="gamedb mysql performance_schema sys" \
--apply-log --redo-only /fullbak

合並日誌
]# innobackupex --user root --password 654321 \
--databases="gamedb mysql performance_schema sys" \
--apply-log --redo-only /fullbak --incremental-dir=/new1dir

]# innobackupex --user root --password 654321 \
--databases="gamedb mysql performance_schema sys" \
--apply-log --redo-only /fullbak --incremental-dir=/new2dir

拷貝備份文件到數據庫目錄
]# innobackupex --user root --password 654321 \
--databases="gamedb mysql performance_schema sys" \
--copy-back /fullbak
]# ls /var/lib/mysql -l

修改文件的所有者/組mysql
]# chown -R mysql:mysql /var/lib/mysql

重啟數據庫服務
]# systemctl restart mysqld
]# mysql -uroot -p654321

+++++++++++++++++++++使用完全備份文件恢復單個表
--export 導出表信息
mysql> alter table 庫.表 discard tablespace; 刪除表空間
mysql> alter table 庫.表 import tablespace; 導入表空間

1完全備份
]# innobackupex --user root --password 654321 \
--databases="studb" /allbakstudb --no-timestamp

2查看備份目錄文件列表
]# ls /allbakstudb
]# ls /allbakstudb/studb

3誤刪除a表: mysql> drop table studb.a;

4 使用完全備份文件恢復單個表
4.1 按照備份時的表結構創建刪除的表
create table studb.a(name char(10));

4.2 刪除創建表的表空間文件
mysql> alter table studb.a discard tablespace;

4.3 使用備份文件導出表信息
]#innobackupex --user root --password 654321 \
--databases="studb" --apply-log --export /allbakstudb

4.4 把導出的表信息文件,拷貝到對應的數據庫目錄下,並修改所有者和組為mysql
]# cp /allbakstudb/studb/a.{cfg,exp,ibd} /var/lib/mysql/studb/
]# chown mysql:mysql /var/lib/mysql/studb/a.*

4.5 導入表空間
mysql> alter table studb.a import tablespace;

[root@mysql51 ~]# rm -rf /var/lib/mysql/studb/a.cfg
[root@mysql51 ~]# rm -rf /var/lib/mysql/studb/a.exp

4.6 查看記錄
mysql> select * from studb.a;

數據備份與恢復