美文网首页程序员
MySQL备份与恢复

MySQL备份与恢复

作者: 无知者云 | 来源:发表于2018-10-09 20: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]
    

    相关文章

      网友评论

        本文标题:MySQL备份与恢复

        本文链接:https://www.haomeiwen.com/subject/qbxjaftx.html