MySQL備份與恢復
準備工作
用docker啟動mysql,同時建立名為my_db
的資料庫:
docker run -d --rm -p 3306:3306\ -e MYSQL_ALLOW_EMPTY_PASSWORD=yes \ -e MYSQL_DATABASE="my_db" \ mysql:5.7.23
在docker host機器上,登入mysql:
mysql --host 127.0.0.1 -P 3306 -u root -p
在my_db
下建立2張表:
CREATE TABLE MY_TABLE ( ID VARCHAR(50) NOT NULL, JSON_CONTENT JSON NOT NULL, PRIMARY KEY (ID) ) ENGINE = InnoDB DEFAULT CHARSET = utf8;
CREATE TABLE MY_TABLE2 ( ID VARCHAR(50) NOT NULL, JSON_CONTENT JSON NOT NULL, PRIMARY KEY (ID) ) ENGINE = InnoDB DEFAULT CHARSET = utf8;
向2張表中分別插入一些資料:
insert into MY_TABLE VALUES('12345','{"pid": 100, "name": "名字"}'); insert into MY_TABLE2 VALUES('12345','{"pid": 102, "name": "名字2"}');
備份資料庫
備份指定資料庫(包含結構和資料):
mysqldump -u [username] –p[password] [database_name] > [dump_file.sql]
在docker的host機器上執行:
mysqldump -h 127.0.0.1 -P 3306 -u root -p my_db > my_db.$(date +%Y-%m-%d-%H.%M.%S).sql
在預設情況下,mysqldump會先drop表,然後建立表,然後插入資料。(這裡我們使用了MySQL的JSON型別,並且在JSON檔案中使用了中文字元,從生成的dump檔案中可以看出mysqldump能夠正常地處理JSON以及JSON中的中文字元)
dump檔案中預設並沒有加上刪除資料庫(drop database
)的指令,如果要加上drop database
,需要同時加上--add-drop-database
以及--databases
或--all-databases
:
`:
mysqldump-h 127.0.0.1 -P 3306 -u root -p --databases my_db--add-drop-database > my_db.$(date +%Y-%m-%d-%H.%M.%S).sql
此時dump檔案中包含:
/*!40000 DROP DATABASE IF EXISTS `my_db`*/; CREATE DATABASE /*!32312 IF NOT EXISTS*/ `my_db` /*!40100 DEFAULT CHARACTER SET latin1 */;
上面的/*!40000 DROP DATABASE IF EXISTS
my_db*/;
並不是註釋,而是MySQL能夠識別的指令。
只備份資料庫的結構
mysqldump -u [username] –p[password] –no-data [database_name] > [dump_file.sql]
備份my_db的結構:
mysqldump -h 127.0.0.1 -P 3306 -u root -p --no-data my_db > my_db.$(date +%Y-%m-%d-%H.%M.%S).sql
只備份資料庫的資料
mysqldump -u [username] –p[password] –no-create-info [database_name] > [dump_file.sql]
備份my_db的資料:
mysqldump -h 127.0.0.1 -P 3306 -u root -p --no-data my_db > my_db.$(date +%Y-%m-%d-%H.%M.%S).sql
可以看到,生成的dump檔案中沒有create table等語句,只有insert等語句。
備份所有資料庫(包括MySQL內建資料庫)
mysqldump -u [username] –p[password] –all-databases> [dump_file.sql]
備份整個MySQL例項中是所有資料庫:
mysqldump -h 127.0.0.1 -P 3306 -u root -p --all-databases > my_db.$(date +%Y-%m-%d-%H.%M.%S).sql
此時,--no-data
(只備份結構)和--no-create-info
(只備份資料)選項也生效。
備份某張(些)表
mysqldump -u [username] –p[password] –no-create-info [database_name] [table_1] [table_n]> [dump_file.sql]
備份多個數據庫
mysqldump -u root -p --databases [database_1] [database_2] [database_n] > content_backup.sql
壓縮
mysqldump -u [uname] -p[pass] [dbname] | gzip -9 > [backupfile.sql.gz]
備份my_db庫並壓縮:
mysqldump -h 127.0.0.1 -P 3306 -u root -p my_db | gzip > my_db.$(date +%Y-%m-%d-%H.%M.%S).sql.gz
解壓
gunzip [backupfile.sql.gz]
資料庫恢復
mysql-h 127.0.0.1 -P 3306 -u [uname] -p[pass] [db_to_restore] < [backupfile.sql]
解壓後恢復
gunzip < [backupfile.sql.gz] | mysql -u [uname] -p[pass] [dbname]