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

mysql數據庫備份與恢復

system ase inux color charsets blog 註釋 更新 create

mysqldump -u 用戶名 -p 數據庫名> 備份的文件名

本文中因服務器為多實例,所以在執行登陸等命令時指定了-S參數,即指定其中一個數據庫

備份:

mysqldump -u root -proot oldboy>/opt/oldboy.sql

[[email protected] opt]# mysql -S /data/3307/mysql.sock -uroot -p -e "show variables like %character%"
Enter password: 
+--------------------------+--------------------------------------------------------------+
| Variable_name | Value | +--------------------------+--------------------------------------------------------------+ | character_set_client | utf8 | | character_set_connection |
utf8 | | character_set_database | utf8mb4 | | character_set_filesystem | binary | | character_set_results | utf8 |
| character_set_server | utf8mb4 | | character_set_system | utf8 | | character_sets_dir | /usr/local/mysql-5.7.9-linux-glibc2.5-x86_64/share/charsets/ | +--------------------------+--------------------------------------------------------------+


指定字符集備份:

[[email protected] opt]# mysqldump -u root -proot --default-character-set=utf8 oldboy>/opt/oldboy.sql

備份參數:

-e : 後面可以執行mysql 命令用;分開
-B :參數的作用是增加創建數據庫和連接數據庫的命令,即create databaseuse database
-d : 備份表結構
-t : 備份數據
-A :all databases
-F : 刷新binlog日誌文件,切割binlog
-x,--lock-all-tables 鎖表
-l,--lock-tables 只讀鎖表
--master-data=1(=2) : 增加binlog日誌文件名及對應的位置點
--compact :去掉註釋,適用於debug,生產不用
--single-transaction : 適合innodb事務數據庫備份
InnoDB表在備份時,通常啟用選項 --single-transaction來保證備份的一致性,實際上它的工作原理是設定本次會話的隔離級別為:REPEATABLE READ,以確保本次會話(dump)時,不會看到其他會話已經提交了的數據。

庫名|gzip:壓縮備份(mysql數據都是文本,壓縮效率高)

myisam備份時,將鎖整個表,導致表無法進行訪問

還原數據庫:

[[email protected] opt]# mysql -uroot -proot oldboy</opt/oldboy_bak.sql



查看備份內容:

[[email protected] opt]# egrep -v "#|\*|--|^$" /opt/oldboy.sql


查看字符集:

[[email protected] opt]# mysql -uroot -proot -e "show variables like %character%"

myqsl多庫備份:

[[email protected] opt]# mysqldump -uroot -proot -B (庫名)oldboy (庫名)ClasssInfo (庫名)oldboy_gbk|gzip >/opt/mysql_bak.sql.gz


mysql分庫備份:
每個庫一個備份文件

mysql -uroot -proot -e "show databases;"|grep -Evi "database|info|perfor"|sed -r s#^([a-z].*$)#mysqldump -uroot -proot --events -B \1|gzip >/opt/\1.sql.gz#g|bash

mysql -S /data/3307/mysql.sock -uroot -proot -e "show databases;"|grep -Evi "database|info|perfor"|sed -r s#^([a-z].*$)#mysqldump -uroot -proot -S /data/3307/mysql.sock --events -B \1|gzip >/opt/bak/\1.sql.gz#g|bash

shell腳本:

for dbname in mysql -uroot -proot -e "show databases;"|grep -Evi "database|info|perfor"
do
mysqldump -uroot -proot -S /data/3307/mysql.sock --events -B $dbname|gzip >/opt/bak/${dbname}_bak.sql.gz
done

備份單個表和多表:
語法:mysqldump -u 用戶名 -p 數據庫名 表名 表名 表名>備份的文件名

mysqldump -u root -p ClassInfo score>/opt/table1.sql

分庫分表備份:
shell腳本:

#!/bin/bash
USER=root
PASSWD=root
SOCK=/data/3306/mysql.sock
LOGIN="mysql -u$USER -p$PASSWD -S $SOCK"
DATABASES=`$LOGIN -e "show databases;"|sed "1d"|egrep -v "^.*sch|mysql"`
dump="mysqldump -u$USER -p$PASSWD -S $SOCK"
for database in $DATABASES
do
[ ! -d /back/$database ] && mkdir -p /back/$database
TABLE=`$LOGIN -e "show tables from $database;"|sed 1d`
for table in $TABLE
do    
$dump $database $TABLE|gzip >/back/$database/${database}_${table}_$(date +%F).sql.gz
done

只備份表結構和只備份數據:

參數-d 備份表結構
參數-t 備份數據

實例:

[[email protected] bak]# mysqldump -uroot -proot -S /data/3307/mysql.sock --compact -d abbott t2
mysqldump: [Warning] Using a password on the command line interface can be insecure.
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t2` (
`id` int(11) DEFAULT NULL,
`name` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
/*!40101 SET character_set_client = @saved_cs_client */;

[[email protected] bak]# mysqldump -uroot -proot -S /data/3307/mysql.sock --compact -t abbott t2 
mysqldump: [Warning] Using a password on the command line interface can be insecure.
INSERT INTO `t2` VALUES (1,abbott),(2,zx),(3,bb);

備份全部數據庫:

mysqldump -u root -proot -A -B --events|gzip >/opt/all.sql.gz

myisam與innodb備份的區別:

myisam推薦:
mysqldump -uroot -proot -A -B --master-data=2 -x|gzip >/opt/all.sql.gz

mysqldump -uroot -proot -A -B --all-databases --flush-privileges --lock-all-tables --master-data=1 --flush-logs --triqqers --routines --events --hex-blob|gzip > $BACKUP_DIR/full_dump_$BACKUP_TIMESTAMP.sql.gz

innodb推薦:
mysqldump -uroot -proot -A -B --master-data=2 --singe-transaction|gzip >/opt/all.sql.gz

mysqldump -uroot -proot --all-databases --flush-privileges --master-data=1 --singe-transaction --flush-logs --triqqers --routines --events --hex-blob|gzip >$BACKUP_DIR/full_dump_$BACKUP_TIMESTAMP.sql.gz


混合引擎,建議使用myisam的備份方式

恢復數據庫實戰:

利用source命令恢復數據庫
進入mysql數據庫控制臺,mysql -u root -p 登錄後
mysql>use 數據庫名

然後使用命令source 命令,後面參數為腳本文件,可以利用system ls 查看文件路徑

mysql>source /opt/all.sql.gz

批量恢復腳本實例:

#!/bin/bash
gzip -d /opt/*.gz

for dbname in `ls *.sql|sed ‘s#_bak.sql##g‘`;
do
mysql -u root -p‘root‘ <${dbname}_bak.sql;
done

=========================================================================================
mysql--show命令總結:

show status; 查看當前會話的數據庫狀態信息
show global status; 查看整個數據庫運行狀態信息,很重要,要分析並做好監控
show full processlist; 查看正在執行的完整的sql語句
show variables; 查看數據庫參數信息


[[email protected] ~]# mysql -S /data/3307/mysql.sock -uroot -proot -e "show full processlist;"
+----+------+-----------+--------+---------+------+----------+-----------------------+
| Id | User |      Host |     db | Command | Time |    State |                  Info |
+----+------+-----------+--------+---------+------+----------+-----------------------+
| 10 | root | localhost | abbott |   Sleep |   18 |          | NULL                  |
| 13 | root | localhost |   NULL |   Query |    0 | starting | show full processlist |
+----+------+-----------+--------+---------+------+----------+-----------------------+

mysql線程中大海撈針

[[email protected] ~]# mysql -S /data/3307/mysql.sock -uroot -proot -e "show full processlist;"|grep -v Sleep


參數修改先在my.cnf中修改,然後再在數據庫中修改,不在my.cnf中修改,重啟後失效:

mysql> set global key_buffer_size=1024*1024*32; 
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like key_buffer%;
+-----------------+----------+
| Variable_name   | Value    |
+-----------------+----------+
| key_buffer_size | 33554432 |
+-----------------+----------+
1 row in set (0.00 sec)


---------------------------------------------
mysqlbinlog ->解析mysql的binlog日誌
用來記錄mysql內部增刪改查等對mysql數據庫有更新的內容記錄。

mysqlbinlog參數:
-d 截取指定庫的binlog
按照位置截取:

mysqlbinlog mysqlbin.000046 --start-position=365 --stop-position=456 -r /opt/pos.sql


按照時間截取:

mysqlbinlog mysql-bin.000046 --start-datetime=2017-06-26 20:16:30 --stop-datetime=2017-06-26 20:20:10 -r time.sql

mysql數據庫備份與恢復