MySQL備份和恢復實戰
MyISAM數據表備份之mysqlhotcopy
數據表爲myisam引擎的備份。可以使用mysqlhotcopy和mysqldump工具進行備份。
1)介紹
這個工具是一個Perl語言寫的腳本。使用mysqlhotcopy必須安裝perl-DBD-MySQL、perl-DBD。
2)特點
a:文件系統級別的copy,mysqldump則是數據庫端的SQL語句集合
b:只能運行在數據庫目錄所在的機器上,mysqldump則任何機器都可以。
c:mysqldump和mysqlhotcopy都執行lock tables和unlock tables
3)備份
a:mysqlhotcopy-u admin -p 'jidian123' --addtodest virtual1 virtual 2 > /tmp
--addtodest:指當備份存在時,不中斷當前備份,只添加新文件進去
4)還原
a:停止數據庫
b:copy -rp /tmp/virtual /mydata55/data
c:啓動數據庫
2、mysqldump範例
範例一
參數:-u –p 庫名
1. 備份
mysqldump -uadmin -p'jidian123' virtual>/opt/virtual.sql
2.查看數據內容
[root@localhost mydata55]# egrep -v"#|--|^$|\*" /opt/virtual.sql
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11)NOT NULL,
`name`varchar(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
LOCK TABLES `user` WRITE;
INSERT INTO `user` VALUES (1,'summer'),(1,'於江磊');
UNLOCK TABLES;
3.導入數據
Mysql –uadmin –p –S /mydata55/mysql.sock virtual </opt/virtual.sql
範例二
參數:-u –p -B 庫名
1.備份
mysqldump -uadmin -p'jidian123' -B virtual>/opt/virtual_B.sql
2. 查看virtual.sql 和virtual_B.sql兩個文件的區別,得出-B作用
[root@localhost opt]# diff virtual.sql virtual_B.sql
18a19,26
> -- Current Database: `virtual`
> --
>
> CREATE DATABASE /*!32312 IF NOT EXISTS*/ `virtual` /*!40100 DEFAULTCHARACTER SET utf8 */;
>
> USE `virtual`;
>
> --
50c58
< -- Dump completed on 2015-08-18 23:07:17
---
> -- Dump completed on 2015-08-18 23:07:27
3.導入數據,注意不要加數據庫
Mysql –uadmin –p –S /mydata55/mysql.sock </opt/virtual_B.sql
範例三
參數:-u –p -B 庫名 gzip
1. 備份
mysqldump -uadmin -p'jidian123' -B virtual |gzip >/opt/virtual_B.sql.gz
[root@localhost opt]# ll
total 16
-rw-r--r--. 1 root root 2007Aug 18 23:07 virtual_B.sql
-rw-r--r--. 1 root root 761 Aug 18 23:38virtual_B.sql.gz
-rw-r--r--. 1 root root 3308 Aug 18 23:27virtual_null.sql
-rw-r--r--. 1 root root 1861 Aug 18 23:07 virtual.sql
小結論:
1.導出數據用-B參數
-B:導出多個庫、增加建庫語句、增加use 語句
2.壓縮數據gzip
2、mysqldump多庫備份
法一:
mysql -u admin-p'jidian123' -S /mydata55/mysql.sock -e"show databases" | grep -Eiv "informat|perform|database" |sed -r 's#^([a-z].*$)#mysqldump -uadmin -p'jidian123' --events -B \1|gzip >/opt/bak/\1.sql.gz#g'|bash
法二:
For循環
金庸新著 $dbname_bak.sql
#!/bin/bash
for dbname in `mysql -u admin -p'jidian123' -S/mydata55/mysql.sock -e "showdatabases;" | grep -Eiv "informat|perform|datab"`
do
mysqldump -uadmin -p'jidian123' -S/mydata55/mysql.sock --events -B $dbname | gzip > ${dbname}_sql.gz
引深:
多表備份:
#!/bin/bash
for tbname in `mysql -u admin -p'jidian123' -S/mydata55/mysql.sock -e "usemysql;show tables"`
do
mysqldump -uadmin -p'jidian123' -S/mydata55/mysql.sock mysql $tbname |gzip >/opt/tb/${tbname}_sql.gz
done
線上多order表備份腳本:(1)
#!/bin/bash
#訂單表備份,共24張表。
#
DE=`date +%F`
DT=`date+%F_%T`
Directory="/home/bak/order"
Host='192.168.0.140'
User="virtual"
DB="virtual"
Pass="V#!2707GIcsSingulax201566"
if [ -d $Directory ];then
echo "備份目錄存在,不用重複建立!"
else
mkdir $Directory -p
fi
cd$Directory && mkdir $DE
for tbname in `mysql -h $Host -u$User -p$Pass -e "use $DB;show tables;" | egrep -Ei "^tb_orders$|*.[0-9]$"`
do
mysqldump -h $Host -u$User -p$Pass $DB $tbname |gzip >$Directory/$DE/${DT}_${tbname}.sql.gz
done
線上多other表備份腳本:(2)
#!/bin/bash
#備份所有非訂單表,共49張。
DE=`date +%F`
DT=`date+%F_%T`
Directory="/home/bak/other"
Host='192.168.0.140'
User="virtual"
DB="virtual"
Pass="V#!2707GIcsSingulax201566"
if [ ! -d$Directory ];then
mkdir $Directory -p
fi
cd$Directory && mkdir $DE
for tbname in `mysql -h $Host -u$User -p$Pass -e "use $DB ;show tables;" | egrep -iv '^tb_orders_h_[0-9]|^tb_orders$|^Tables_in_virtual$|^orders_view$'`
do
mysqldump -h $Host -u$User -p$Pass $DB $tbname |gzip >$Directory/$DE/${DT}_${tbname}.sql.gz
done
http://edu.51cto.com/course/course_id-808.html
3、mysqldump多個參數 *****
參數:
-u
–p
-A --all-databases
-B 導出多個數據庫,sql文件包含CREATE DATABASE and USE statements
-F --flush-logs
gzip
-d 只導結構
-t 只導數據
-x --lock-all-tables
--single-transaction 保證mysqldump進程看到的數據,是落地的。數據完整性
--master-data=1|2 1代表pos點不註釋,2代表
-E --events
---triggers
-R --routines
--default-character-set 導出指定字符集
--flush-privileges 刷新權限
生產環境:
提示:
1.加-A不用加-B
2.
for MyISAM:
mysqludmp-uadmin -p'jidian123' -A --flush-privileges -x --master-data=1 \
-F --events --triggers --routines >bak.sql
for InnoDB:
mysqldump -uroot-p'jidian123' -A --flush-privileges --single-transaction \
--master-data=1 --flush-logs --events --triggers --routines >bak.sql