MySQL數據備份與恢復
mysql 命令行 跨平臺 MySQL官方bundle包自帶
MySQL-Workbench 圖形 跨平臺 MySQL官方提供
MySQL-Front 圖形 Windows 開源,輕量級客戶端軟件
phpMyAdmin 瀏覽器 跨平臺 開源,需LAMP平臺
Navicat 圖形 Windows 專業、功能強大、商業版
PhpMyAdmin部署思路:
1.安裝httpd、mysql、php-mysql及相關包
2.啟動httpd服務程序
3.解壓phpMyAdmin包,部署到網站目錄
4.配置config.inc.php,指定MySQL主機地址
5.創建授權用戶
yum -y install httpd php php-mysql
tar -zxf phpMyAdmin-2.11.11-all-languages.tar.gz -C /var/www/html/
cd /var/www/html/
mv phpMyAdmin-2.11.11-all-languages/ phpmyadmin
chown -R apache:apache phpmyadmin/
cp phpmyadmin/config.sample.inc.php phpmysdmin/config.inc.php
vim /var/www/html/phpmyadmin/config.inc.php
$cfg[‘blowfish_secret‘] = ‘123456‘;
mysql>create database bbsdb;
mysql>grant all on bbsdb.* to admin@‘localhost‘ identified by ‘654321‘;
systemclt start httpd
firefox http://localhost/phpmyadmin
MySQL數據備份與恢復
數據備份方式:
1.物理備份,冷備份:cp 、 tar 、 ....
例:物理備份與恢復
備份操作格式:
tar -zcvf xxx.tar.gz /var/lib/mysql/數據庫/*
恢復操作格式:
cp -rp 備份目錄/文件名 /var/lib/mysql/(默認存儲路徑)
tar -zxvf xxx.tar.gz -C /var/lib/mysql/數據庫名/
2.邏輯備份,mysqldump 、mysql
原理:執行備份時,根據已有的庫和表生成對應SQL命令,把生成的SQL命令存儲到指定的備份文件裏。
備份策略:
完全備份:備份所有數據(一臺服務器,一個庫,一張表)
增量備份:備份自上一次備份(包含完全備份、差異備份、增量備份)之後有變化的數據。
差異備份:備份自上一次完全備份之後有變化的數據。
例:邏輯備份及恢復
完全備份操作格式:
mysqldump -u用戶名 -p密碼 源庫名 > 路徑/xxx.sql
完全備份的恢復操作格式:
mysql -u用戶名 -p密碼 目標庫名 < 路徑/xxx.sql
庫名的表示方式:
--all-databases 所有庫
庫名 指定的單個庫
庫名.表名 指定庫的指定表
-B 庫名1 庫名2 .. 備份多個庫
註意事項:
無論備份還是恢復,都要驗證用戶及權限。
例:
將所有的庫備份為mysql-all.sql文件
mysqldump -u root -p 123456 --all-databases > alldb.sql
將userdb庫備份為userdb.sql文件
mysqldump -u root -p 123456 userdb > userdb.sql
將備份文件userdb.sql恢復到userdb3庫
mysql>create databases userdb3;
mysql -u roo -p 123456 userdb3 < userdb.sql
實時增量備份
binlog日誌
類型:二進制日誌,用途:記錄所有更改數據的操作,
配置:
log_bin[=dir/name]
server_id=數字
max_binlog_size=數字m
啟用binlog日誌
采用binlog日誌的好處
1.記錄除查詢之外的所有SQL命令。
2.用於數據恢復。
3.配置mysql主從同步的必要條件。
例:
vim /etc/my.cnf
[mysqld]
....
log_bin //啟用binlog日誌
server_id=100 //指定id值,id號不能重復(1-255)範圍。
systemctl restart mysqld
binlog相關文件
默認日誌文件名:
主機名-bin.index //記錄已有的binlog日誌文件名
主機名-bin.000001 //第1個二進制日誌(達到500M存去下一條紀錄)
主機名-bin.000002 //第2份二進制日誌
....
手動生成新的日誌文件
1.重啟mysql服務
2.執行SQL操作 mysql > flush logs;(flush logs,切換到下一個binlog日誌文件)
3.mysqldump --flush-logs
4.mysql -uroot -p密碼 -e ‘flush logs‘
清理binlog日誌
刪除早於指定版本的binlog日誌:
purge master logs to ‘binlog文件名‘;
刪除所有binlog日誌,重建新日誌:
reset master;
例:
mysql>purge master logs to ‘mysql-bin.000003‘;
mysql>reset master;
分析binlog日誌
查看日誌當前記錄格式:
mysql>show variables like ‘binlog_format‘;
修改日誌記錄格式:
vim /etc/my.cnf
[mysqld]
....
binlog_format="mixed" 設置日誌文件的記錄格式
systemctl restart mysqld
三種記錄格式:
1.statement: 每一條修改數據的sql命令都會記錄在binlog日誌中。
2.row: 不記錄sql語句上下文相關信息,僅保存哪條記錄被修改。
3.mixed: 是以上兩種格式的混合使用。
binlog日誌文件記錄sql命令的方式:
1.時間點
2.pos點(偏移量)
使用mysqlbinlog工具
格式:mysqlbinlog [選項] binlog日誌文件名
常用選項:
1.時間點:
--start-datetime="yyyy-mm-dd hh:mm:ss"
--stop-datetime="yyyy-mm-dd hh:mm:ss"
2.pos點:
--start-position=數字
--stop-position=數字
例:
查看從2017年1月2日15:30開始的更改操作
mysqlbinlob --start-datetime="2017-01-01 15:30" /var/lib/mysql-bin.000001
....
at 318
binlog恢復數據
基本思路:
1.使用mysqlbinlog提取歷史SQL操作
2.通過管道交給mysql命令執行
例:
恢復第1份binlog日誌的部分信息
mysqlbinlog --start-position=296 --start-position=1073 /var/lib/mysql-bin.000001 |mysql -uroot -p123456
MySQL備份工具
物理備份缺點:
1.跨平臺性差
2.備份時間長、冗余備份、浪費存儲空間
mysqldump備份缺點:
1.效率較低,備份和還原速度慢。
2.備份過程中,數據插入和更新操作會被掛起。
XtraBackup備份工具:
1.備份過程中不鎖庫表,適合生產環境。
2.由專業組織Percona提供(改進MySQL分支)。
主要含兩個組件:
1.xtrabackup:C程序,支持InnoDB/XtraDB
2.innobackupex:以Perl腳本封裝xtrabackup,還支持MyISAM
支持事務和事務回滾,要求存儲引擎為innodb
事務日誌文件:
ibdata
LSN 日誌序列號
ib_logfile0 //SQL命令
ib_loggile1
....
安裝XtraBackup
yum -y install per-Digest-MD5.x86_64 rsync perl-DBD-MySQL
rpm -ivh libev-4.15-1.el6.rf.x86_64.rpm
rpm -ivh percona-xtrabackup-24-2.4.7-1.el7.x86_64.rpm
rpm -ql percona-xtrabackup-24
/usr/bin/innobackupex //備份innodb、xtrdb、myisam引擎的表
/usr/bin/xbcloud
....
/usr/bin/xtrabackup //備份innodb、xtrdb引擎的表
....
innobackupex基本選項
--host //主機名
--user //用戶名
--port //端口號
--password //密碼
--databases //數據庫名(單個庫:databases="庫名",多個庫:databases="庫1 庫2",單個表:databases="庫.表")
--no-timestamp //不用日期命名備份文件存儲的子目錄名
--redo-only //日誌回滾合並(最後一次增量備份日誌回滾不需要此選項)
--apply-log //準備還原(回滾日誌)
--copy-back //恢復數據
--incremental 目錄名 //增量備份
--incremental-basedir=目錄名 //增量備份時,指定上一次備份數據存儲的目錄名
--incremental-dir=目錄名 //準備恢復數據時,指定增量備份數據存儲的目錄名
--export //導出表信息
import //導出表空間
XtraBackup完全備份
格式:innobackupex -user 用戶名 --password 密碼 --databases="系統庫列表和存儲數據庫" 備份目錄名 --no-timestamp
例:將所有庫完全備份到 /backup
innobackupex --user root --password 123456 /backup --no-timestamp
XtraBackup完全恢復
完全恢復時要求空的庫目錄
rm -rf /var/lib/mysql
mkdir /var/lib/mysql
chown -R mysql:mysql /var/lib/mysql
格式:innobackupex -user 用戶名 --password 密碼 --databases="系統庫列表和存儲數據庫" --copy-back 備份目錄名
例:恢復所有數據
innobackupex --user root --password 123456 --copy-back /backup
XtraBackup增量備份
必須先有一次完全備份
格式:innobackupex --user 用戶名 --password 密碼 databases="系統庫列表和存儲數據庫" --incremental 目錄名 --incremental-basedir="完全備份目錄名" -no-timestamp
例:完全備份到/allbak、第一次增量備份到/new1、第二次增量備份到/new2
cp -rp /var/lib/mysql/mysql /root/mysql.bak //備份授權庫
innobackupex --user root --password 123456 --databases="gamedb" /fullbak --no-timestamp //完全備份
innobackupex --user root --password 123456 --databases="gamedb" --incremental /new1 --incremental-basedir="/fullbak" --no-timestamp //第一次增量備份
innobackupex --user root --password 123456 --databases="gamedb" --incremental /new2 --incremental-basedir="/new1" --no-timestamp //第二次增量備份
XtraBackup增量恢復
rm -rf /var/lib/mysql
mkdir /var/lib/mysql
chown -R mysql:mysql /var/lib/mysql
格式:
1.innobackupex --user 用戶名 --password 密碼 --databases="系統庫列表和存儲數據庫" --apply-log --redo-only 完全備份目錄名
2.innobackupex --user 用戶名 --password 密碼 --databases="系統庫列表和存儲數據庫" --apply-log --redo-only 完全備份目錄名 --incremental-dir=增量備份目錄名
3.innobackupex --user 用戶名 --psssword 密碼 --databases="系統庫列表和存儲數據庫" --copy-back 完全備份目錄名
例:恢復第一次增量備份到/new1、第二次增量備份到/new2的數據
rm -rf /var/lib/mysql
mkdir /var/lib/mysql
innobackupex --user root --password 123456 --databases="gamedb" --apply-log --redo-only /fullbak //恢復完全備份
innobackupex --user root --password 123456 --databases="gamedb" --apply-log --redo-only /fullbak --incremental-dir="/new1" //恢復增量
innobackupex --user root --password 123456 --databases="gamedb" --apply-log /fullbak --incremental-dir="new2" //恢復增量
innobackupex --user root --password 123456 --databases="gamedb" --copy-back /fullbak //拷貝文件
cp -r /root/mysql.bak /var/lib/mysql/mysql
chown -R mysql:mysql /var/lib/mysql
恢復完全備份文件中的單個表
格式:innobackupex innobackupex --user 用戶名 --password 密碼 --databases="系統庫列表和存儲數據庫" --apply-log --export 完全備份目錄名
例:完全備份數據庫到/allbak目錄
innobackupex --user root --password 123456 --databases="gamedb" /allbak --no-timestamp //完全備份
mysql>drop table gamedb.a;
innobackupex --user root --password 123456 --databases="gamedb" --apply-log --export /allbak //導出表信息
mysql>create table gamedb.a(id int); //創建表
mysql>alter table gamedb.a discard tablespace; //刪除表空間
cp /allbak/gamedb/a.{ibd,cfg,exp} /var/lib/mysql/gamedb //拷貝表信息文件
chown mysql:mysql /var/lib/mysql/gamedb/a.* //修改所有者
mysql>alter table gamedb.a import tablespace; //導入表空間
MySQL數據備份與恢復