准备工作
用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]
网友评论