您好,登錄后才能下訂單哦!
1 數據備份與恢復
1 數據備份與恢復
1.1 數據備份方式
物理備份:直接拷貝庫或者表對應的文件。cp,tar, ...
具有局限性,前提是表的存儲引擎為myisam,跨平臺性差,數據備份恢復浪費時間。
邏輯備份:執行備份時,根據已有的數據,生成對應的sql命令,把sql保存到指定的文件里。恢復時執行備份文件里的sql命令。
1.2 數據備份策略
完全備份:備份所有數據。
增量備份:備份自上一次備份之后有變化的數據
差異備份:備份自完全備份之后有變化的數據
完全備份+增量備份
完全備份+差異備份
1.3 完全備份
備份命令:
[root@ser51 ~]#mysqldump -hlocalhost -uroot -p密碼 源庫名 >文件名
源庫名的表示:
--all-databases 所有庫
庫名 指定單個庫
庫名 表名 指定庫的表(注意庫名和表名之間是空格)
-B 數據庫1 數據庫2 備份多個庫
恢復命令:
兩種方式:
(1)[root@ser51 ~]#mysql 連接庫操作 目標庫名 <文件名.sql
(2)mysql>source 備份文件路徑;
1.4 增量備份
(1)啟用binlog日志 實現實時增量備份
binlog日志介紹:二進制日志,是mysql數據庫服務日志文件中的一種,記錄執行的除查詢之外的sql命令。默認沒有啟用。
vim /etc/my.cnf
[mysqld]
server_id=數值 #數值范圍1-255
log_bin #啟用默認存放路徑/var/lib/mysql/
binlog_format="mixed"
重啟服務之后生成的文件為:
/var/lib/mysql/主機名-bin.000001
#超過500M生成新的(000001-999999)
/var/lib/mysql/localhost-bin.index #索引文件
#systemctl restart mysqld #重啟服務
(2)查看日志當前記錄格式
mysql > show variables like "binlog_format";
三種記錄格式:
statement:每一條修改數據的sql命令都會記錄在binlog日志中;
row:不記錄sql語句上下文相關信息,僅保存哪條記錄被修改。;
mixed:是以上兩種格式的混合使用。
(3)查看binlog日志文件內容
#mysqlbinlog /var/lib/mysql/localhost-bin.000001
# mysqlbinlog localhost-bin.000001 | grep -i insert
(4)自定義binlog日志文件存儲的目錄和文件名
# mkdir /logdir
# chown mysql /logdir; setenforce 0
#vim /etc/my.cnf
server_id=數值 #數值范圍1-255
log_bin=/logdir/mysql
#自定義存放路徑(mysql相當于主機名,必須寫,無需mkdir)
binlog_format="mixed"
#systemctl restart mysqld
#ls /logdir/
(5)分析binlog日志
binlog日志文件記錄sql命令的方式?
時間點
--start-datetime="yyyy-mm-dd hh:mm:ss"
--stop-datetime="yyyy-mm-dd hh:mm:ss"
pos點(偏移量)
--start-position=數字
--stop-position=數字
[root@ser51 logdir]# mysqlbinlog
--start-position=336 --stop-position=1494 mysql.000001
(6)執行binlog日志里的sql命令恢復數據
#mysqlbinlog [選項] 日志文件名 | mysql -uroot -p123qqq
#mysqlbinlog --start-position=300 --stop-position=1006 /var/lib/mysql/localhost-bin.000001 | mysql -uroot -p123456
(7)手動生成新的binlog日志
第1種:mysql> flush logs; #刷新一次生成一次
第2種:mysql -uroot -p123qqq -e "flush logs"
#-e就是以mysql登錄方式執行sql命令
第3種:# systemctl restart mysqld
第4種:#mysqldump -uroot -p123qqq --flush-logs teadb t7 > /databak/t7.sql #備份的時候重新生成
(8)刪除已有的binlog日志文件
第1種:mysql> reset master; #重置所有
第2種:mysql> purge master logs to "binlog文件名";
#刪除指定binlog之前的日志
第3種:#rm -rf binlog日志文件
2.1 安裝Percona
一款強大的在線熱備份工具,備份過程中不鎖庫表,適合生產環境。
主要含兩個組件:
xtrabackup:
innobackupex:
[root@ser51 ~]# yum -y install perl-Digest-MD5 perl-DBD-MySQL
#環境不一樣安裝的依賴包不一樣
[root@ser51 ~]# rpm -ivh libev-4.15-1.el6.rf.x86_64.rpm
[root@ser51 ~]# rpm -ivh percona-xtrabackup-24-2.4.7-1.el7.x86_64.rpm
2.2 innobackupex完全備份
(1) 基本選項:
--host --user --port --password --databases=
--no-timestamp #不用日期命名備份文件存儲的子目錄名
--redo-only #日志回滾合并,最后一次增量備份日志回滾不需要此項
--apply-log #準備還原(回滾日志)
--copy-back #恢復數據
--incremental 目錄名 #增量備份存放的路徑
--incremental--basedir=目錄名
#增量備份時,指定上一次備份數據存儲的目錄名
--incremental--dir=目錄名 #恢復數據時,指定增量備份數據存儲的目錄名
--export #導出表信息
import #導入表空間
恢復數據的時候要求數據庫目錄必須是空的(/var/lib/mysql)
(2) 使用innobackupex做完全備份和完全恢復
案例:完全備份到/allback中
[root@ser51 ~]#innobackupex --user root --password 123456 --databases="mysql performance_schema sys db66" /allback
#databases:要備份的數據庫名 /allback創建的時候自動生成,無需創建
[root@ser51 ~]#ls /allback/2018-01-22_21-19-33/
#查看生成的備份文件
[root@ser51 ~]#innobackupex --user root --password 123456 --databases="mysql performance_schema sys db66" --apply-log /allback/2018-01-22_21-19-33
#同步日志
[root@ser51 ~]#rm -rf /var/lib/mysql/ #恢復時要求清空
[root@ser51 ~]#mkdir /var/lib/mysql #創建新的
[root@ser51 ~]#innobackupex --user root --password 123456 --databases="mysql performance_schema sys db66" --copy-back /allback/2018-01-22_21-19-33
#恢復數據
[root@ser51 ~]#ls -ld /var/lib/mysql #查看目錄的屬性
[root@ser51 ~]#chown -R mysql:mysql /var/lib/mysql
#更改為所有者,屬組為mysql
[root@ser51 ~]#systemctl restart mysqld #重啟服務
[root@ser51 ~]#mysql -uroot -p123456 #進入查看是否恢復成功
如果服務沒有成功?
mv /etc/my.cnf /etc/my.cnf.back
mysql_install_db --user=mysql --datadir=/var/lib/mysql
2.3 innobackupex增量備份
(1) 條件
必須有一次完全備份,本例以備份到/onedir為例
第一次增量備份到/new1dir中
第二次增量備份到/new2dir中
(2)增量備份
第一步:完全備份
[root@ser51 ~]#innobackupex --user root --password 123456 --databases="mysql performance_schema sys db66" /onedir --no-timestamp
第二步:改變db66數據庫表中的數據
進行第一次的增量備份到/new1dir
[root@ser51 ~]#innobackupex --user root --password 123456 --databases="mysql performance_schema sys db66" --incremental /new1dir --incremental-basedir=/onedir --no-timestamp
#增量備份時,指定上一次備份數據存儲的目錄名
第三步:再次改變db66數據庫表中的數據
進行第二次的增量備份到/new2dir
[root@ser51 ~]#innobackupex --user root --password 123456 --databases="mysql performance_schema sys db66" --incremental /new2dir --incremental-basedir=/new1dir --no-timestamp
第四步:數據恢復
[root@ser51 ~]# innobackupex --user root --password 123456 --databases="mysql performance_schema sys db66"
--apply-log --redo-only /onedir #恢復完全備份日志
[root@ser51 ~]# innobackupex --user root --password 123456 --databases="mysql performance_schema sys db66"
--apply-log --redo-only /onedir/ --incremental-dir=/new1dir
#恢復增量日志
[root@ser51 ~]# innobackupex --user root --password 123456 --databases="mysql performance_schema sys db66"
--apply-log --redo-only /onedir/ --incremental-dir=/new2dir
#恢復增量日志
[root@ser51 ~]# innobackupex --user root --password 123456 --databases="mysql performance_schema sys db66" --copy-back /onedir #恢復文件
[root@ser51 ~]# chown -R mysql:mysql /var/lib/mysql/
[root@ser51 ~]# systemctl restart mysqld
登錄數據庫查看數據是否恢復
2.4 增量備份原理:
在/var/lib/mysql/下存在事務日志ib_logfile0 和ib_logfile1 ibdata1
備份之后同步日志會在新的備份的文件內存在以下兩個文件:
xtrabackup_checkpoints #存在lsn:日志序列號
xtrabackup_logfile #日志文件
每一次的增量恢復日志時,會和完全備份的日志進行合并,并且日志序列號會發生變化,這個變化記錄了合并的序列號位置,同時會把增量備份的數據合并到完全備份中。
[root@ser51 ~]# cat /onedir/xtrabackup_checkpoints
[root@ser51 ~]# cat /new1dir/xtrabackup_checkpoints
[root@ser51 ~]# cat /new2dir/xtrabackup_checkpoints
2.5恢復完全備份數據中的某張表
(1)刪除表空間命令
mysql> alter table 庫.表 discard tablespace;
(2)前提完全備份的數據庫:
#innobackupex --user root --password 123456 --databases="db66" /db66bak --no-timestamp
#ls /db66bak
(3)mysql> use db66;
mysql> drop table a; #刪除表a,對表a操作恢復的過程
mysql> create table a(id int); # 建空表,表字段信息必須和原來一致
#ls /var/lib/mysql/db66/
a.frm a.ibd
(4)導出表信息
#innobackupex --user root --password 123456
--databases="db66" --apply-log --export /db66bak
#ls /db66bak/db66/ #查看發生了什么變化
(5)刪除表空間
mysql> alter table db66.a discard tablespace;
#ls /var/lib/mysql/db66/
(6)把備份目錄下導出的表信息文件拷貝到數據庫目錄下
# cp /db66bak/db66/a.{cfg,exp,ibd} /var/lib/mysql/db66/
(7)修改文件所有者
# chown mysql /var/lib/mysql/db66/a.*
(8)導入表空間
mysql> alter table db66.a import tablespace;
mysql> select * from a;
mysql> select * from b;
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。