程序员

MySQL备份与恢复

2018-10-09  本文已影响0人  无知者云

准备工作

用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 EXISTSmy_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]
上一篇下一篇

猜你喜欢

热点阅读