MySQL 数据库增量备份与恢复数据命令实战

1. 备份单个数据库练习 mysqldump 命令多种参数的使用

1.1 调整 MySQL 客户端及服务端字符集为建库建表时默认的 latin1,避免备份时的乱码问题

[root@mysql-server ~]# vi /etc/my.cnf

[root@mysql-server ~]# sed -n '18,19p' /etc/my.cnf

[client]

default-character-set=latin1   #  把 MySQL 客户端字符集改为默认的拉丁。

[root@mysql-server ~]# sed -n '27,28p' /etc/my.cnf

[mysqld]

character-set-server=latin1    #  把 MySQL 服务端字符集改为默认的拉丁。

1.2 MySQL 数据库的备份命令 mysqldump 基本语法

mysqldump -u 用户名 -p 数据库名 >备份的文件名

1.3 备份并恢复 oldboy 库

1.3.1 备份

[root@mysql-server ~]# mysql -uroot -p111111

mysql> use oldboy   

mysql> select * from student;   #  查看备份前数据。

| id | name      |

|  1 | oldboy    |

|  2 | oldgirl     |

|  3 | inca        |

|  4 | zuma      |

|  5 | kaka       |

|  6 | 老男孩    |

|  7 | 老男孩    |

|  8 | 老男人    |

|  9 | 张雷       |

[root@mysql-server ~]# mysqldump -uroot -p'111111' oldboy >/opt/mysql_bak.sql  #  备份。

[root@mysql-server ~]# egrep -v "#|\*|--|^$" /opt/mysql_bak.sql    #  查看备份数据内容。

DROP TABLE IF EXISTS `student`;   #  删除表(恢复数据时会删除老的表)

CREATE TABLE `student` (

  `id` int(4) NOT NULL AUTO_INCREMENT,

  `name` char(20) NOT NULL,

  PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=latin1;

LOCK TABLES `student` WRITE;   #  锁表。

INSERT INTO `student` VALUES (1,'oldboy'),(2,'oldgirl'),(3,'inca'),(4,'zuma'),(5,'kaka'),(6,'老男孩'),(7,'老男孩'),(8,'老男人'),(9,'张雷');   #  一条语句插入数据减少磁盘 I/O 。

UNLOCK TABLES;

[root@mysql-server ~]# mysqldump -uroot -p'111111' --default-character-set=latin1 oldboy >/opt/mysql_bak.sql    #  指定字符集导出数据也可以避免乱码问题。

1.3.2 测试恢复数据             

[root@mysql-server ~]# mysql -uroot -p111111 -e "use oldboy;drop table student;"  

#  删除 student 表,模拟数据库丢失场景。(备份文件中默认包含删表语句)

[root@mysql-server ~]# mysql -uroot -p111111 -e "select * from oldboy.student;"

ERROR 1146 (42S02) at line 1: Table 'oldboy.student' doesn't exist    #  该表已不存在。

[root@mysql-server ~]# mysql -uroot -p'111111' oldboy </opt/mysql_bak.sql  #  恢复数据。

[root@mysql-server ~]# mysql -uroot -p111111 -e "select * from oldboy.student;"  

 #查看恢复数据的结果(可以看到数据恢复成功)。

| id | name      |

|  1 | oldboy    |

|  2 | oldgirl     |

|  3 | inca        |

|  4 | zuma      |

|  5 | kaka       |

|  6 | 老男孩    |

|  7 | 老男孩    |

|  8 | 老男人    |

|  9 | 张雷        |

1.4 加 -B 参数备份名字为 oldboy 的库

1.4.1 备份

[root@mysql-server ~]# mysqldump -uroot -p'111111' -B oldboy >/opt/mysql_bak_B.sql

[root@mysql-server ~]# cd /opt

[root@mysql-server opt]# diff mysql_bak.sql mysql_bak_B.sql

>

> CREATE DATABASE /*!32312 IF NOT EXISTS*/ `oldboy` /*!40100 DEFAULT CHARACTER SET latin1 */;

>

> USE `oldboy`;

-B 参数的作用之一:

该参数实现了在备份数据中添加一条自动创建备份的数据库(如果该库不存在)的 SQL 语句和切换数据库的 SQL 语句的功能。【生产场景要加该参数】

1.4.2 登陆数据库模拟丢失 oldboy 库的场景

[root@mysql-server opt]# mysql -uroot -p111111

mysql> show databases;

mysql> drop database oldboy;

1.4.3 恢复数据

[root@mysql-server opt]# mysql -uroot -p'111111' oldboy </opt/mysql_bak.sql

ERROR 1049 (42000): Unknown database 'oldboy'

#  用前面的备份数据恢复不成功,提示未知的 oldboy 库。(因为已经删除)

[root@mysql-server opt]# mysql -uroot -p'111111' </opt/mysql_bak_B.sql

#  用加 -B 参数的备份恢复数据库(无需指定库,自动创建)。

[root@mysql-server opt]# mysql -uroot -p111111 -e "select * from oldboy.student;"   

| id | name      |

|  1 | oldboy    |

|  2 | oldgirl     |

|  3 | inca        |

|  4 | zuma      |

|  5 | kaka       |

|  6 | 老男孩    |

|  7 | 老男孩    |

|  8 | 老男人    |

|  9 | 张雷        |

1.5 指定压缩命令压缩备份的 MySQL 数据

[root@mysql-server ~]# ll /opt/

-rw-r--r--  1 root root   2150 4月  10 20:18 mysql_bak_B.sql

-rw-r--r--  1 root root   2005 4月  10 20:06 mysql_bak.sql

[root@mysql-server ~]# mysqldump -uroot -p'111111' -B oldboy|gzip >/opt/mysql_bak_B.sql.gz

[root@mysql-server ~]# ll /opt/  #  压缩效率接近三倍。

-rw-r--r--  1 root root   2150 4月  10 20:18 mysql_bak_B.sql

-rw-r--r--  1 root root   2005 4月  10 20:06 mysql_bak.sql

-rw-r--r--  1 root root    848 4月  10 20:42 mysql_bak_B.sql.gz

小结:① 导出数据加 -B 参数;② 用 gzip 对导出数据进行压缩。

1.6 mysqldump 工作原理

利用 mysqldump 命令备份数据的过程,实际上就是把数据从 MySQL 库里以逻辑的 SQL 语句的形式直接输出或者生成备份的文件的过程。

1.6.1 备份的数据过滤掉注释都是 SQL 语句,结果如下

[root@mysql-server ~]# egrep -v "#|\*|--|^$" /opt/mysql_bak_B.sql

USE `oldboy`;

DROP TABLE IF EXISTS `student`;

CREATE TABLE `student` (

  `id` int(4) NOT NULL AUTO_INCREMENT,

  `name` char(20) NOT NULL,

  PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=latin1;

LOCK TABLES `student` WRITE;

INSERT INTO `student` VALUES (1,'oldboy'),(2,'oldgirl'),(3,'inca'),(4,'zuma'),(5,'kaka'),(6,'老男孩'),(7,'老男孩'),(8,'老男人'),(9,'张雷');

UNLOCK TABLES;

2. 备份多个数据库练习 mysqldump 命令多种参数的使用

2.1 备份数据库中的 oldboy 和 oldboy_gbk 两个库

mysql> show databases;    #  查看数据库。

| Database           |

| information_schema |

| oldboy            |

| oldboy_gbk   |

[root@mysql-server ~]# mysqldump -uroot -p'111111' -B oldboy oldboy_gbk|gzip >/opt/mul.sql.gz

-B 参数的说明:

-B 参数很关键,表示接多个库,并且增加 create database db 和 use db 的信息。该参数用于导出若干个数据库,在备份结果中会加入创建库和切换库的语句。

2.2 分库备份:每个库备份成单个对应的备份文件

2.2.1 方法一:通过命令行一条命令实现备份

[root@mysql-server ~]# mysql -uroot -p'111111' -e "show databases;"|grep -Evi "database|infor|perfor"

bbs

mysql

oldboy

oldboy_gbk

oldboy_utf8

wordpress

[root@mysql-server ~]# mysql -uroot -p'111111' -e "show databases;"|grep -Evi "database|infor|perfor"|sed 's#^#mysqldump -uroot -p'111111' -B #g'

mysqldump -uroot -p111111 -B bbs

mysqldump -uroot -p111111 -B mysql

mysqldump -uroot -p111111 -B oldboy

mysqldump -uroot -p111111 -B oldboy_gbk

mysqldump -uroot -p111111 -B oldboy_utf8

mysqldump -uroot -p111111 -B wordpress

[root@mysql-server ~]# mysql -uroot -p'111111' -e "show databases;"|grep -Evi "database|infor|perfor"|sed -r 's#^([a-z].*$)#mysqldump -uroot -p'111111' -B \1 >/opt/\1 #g'

mysqldump -uroot -p111111 -B bbs >/opt/bbs

mysqldump -uroot -p111111 -B mysql >/opt/mysql

mysqldump -uroot -p111111 -B oldboy >/opt/oldboy

mysqldump -uroot -p111111 -B oldboy_gbk >/opt/oldboy_gbk

mysqldump -uroot -p111111 -B oldboy_utf8 >/opt/oldboy_utf8

mysqldump -uroot -p111111 -B wordpress >/opt/wordpress

[root@mysql-server ~]# mysql -uroot -p'111111' -e "show databases;"|grep -Evi "database|infor|perfor"|sed -r 's#^([a-z].*$)#mysqldump -uroot -p'111111' -B \1 >/opt/\1.sql #g'

mysqldump -uroot -p111111 -B bbs >/opt/bbs.sql

mysqldump -uroot -p111111 -B mysql >/opt/mysql.sql

mysqldump -uroot -p111111 -B oldboy >/opt/oldboy.sql

mysqldump -uroot -p111111 -B oldboy_gbk >/opt/oldboy_gbk.sql

mysqldump -uroot -p111111 -B oldboy_utf8 >/opt/oldboy_utf8.sql

mysqldump -uroot -p111111 -B wordpress >/opt/wordpress.sql

[root@mysql-server ~]# mysql -uroot -p'111111' -e "show databases;"|grep -Evi "database|infor|perfor"|sed -r 's#^([a-z].*$)#mysqldump -uroot -p'111111' -B \1|gzip >/opt/\1.sql #g'

mysqldump -uroot -p111111 -B bbs|gzip >/opt/bbs.sql

mysqldump -uroot -p111111 -B mysql|gzip >/opt/mysql.sql

mysqldump -uroot -p111111 -B oldboy|gzip >/opt/oldboy.sql

mysqldump -uroot -p111111 -B oldboy_gbk|gzip >/opt/oldboy_gbk.sql

mysqldump -uroot -p111111 -B oldboy_utf8|gzip >/opt/oldboy_utf8.sql

mysqldump -uroot -p111111 -B wordpress|gzip >/opt/wordpress.sql

[root@mysql-server ~]# mysql -uroot -p'111111' -e "show databases;"|grep -Evi "database|infor|perfor"|sed -r 's#^([a-z].*$)#mysqldump -uroot -p'111111' -B \1|gzip >/opt/\1.sql.gz #g'|bash

-- Warning: Skipping the data of table mysql.event. Specify the --events option explicitly.

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

[root@mysql-server ~]# mkdir /opt/bak   #  为了更明显的效果,创建存放备份的目录。

[root@mysql-server ~]# mysql -uroot -p'111111' -e "show databases;"|grep -Evi "database|infor|perfor"|sed -r 's#^([a-z].*$)#mysqldump -uroot -p'111111' --events  -B \1|gzip >/opt/bak/\1.sql.gz #g'|bash

[root@mysql-server ~]# ll /opt/bak   

总用量 392

-rw-r--r-- 1 root root 226932 4月  11 00:18 bbs.sql.gz

-rw-r--r-- 1 root root 144461 4月  11 00:18 mysql.sql.gz

-rw-r--r-- 1 root root    540 4月     11 00:18 oldboy_gbk.sql.gz

-rw-r--r-- 1 root root    861 4月     11 00:18 oldboy.sql.gz

-rw-r--r-- 1 root root    540 4月     11 00:18 oldboy_utf8.sql.gz

-rw-r--r-- 1 root root  10189 4月   11 00:18 wordpress.sql.gz

2.2.2 方法二:通过 Shell 脚本实现分库备份

[root@mysql-server ~]# cd /server/scripts

[root@mysql-server scripts]# cat fenku.sh

#!/bin/bash

for dbname in `mysql -uroot -p'111111' -e "show databases;"|grep -Evi "database|infor|perfor"`

do

mysqldump -uroot -p'111111' --events  -B $dbname|gzip >/opt/bak/${dbname}_bak.sql.gz

done

[root@mysql-server scripts]# sh fenku.sh

[root@mysql-server scripts]# ll /opt/bak/

总用量 784

-rw-r--r-- 1 root root 226932 4月  11 00:36 bbs_bak.sql.gz

-rw-r--r-- 1 root root 144461 4月  11 00:36 mysql_bak.sql.gz

-rw-r--r-- 1 root root    861 4月     11 00:36 oldboy_bak.sql.gz

-rw-r--r-- 1 root root    540 4月     11 00:36 oldboy_gbk_bak.sql.gz

-rw-r--r-- 1 root root    540 4月     11 00:36 oldboy_utf8_bak.sql.gz

-rw-r--r-- 1 root root  10188 4月   11 00:36 wordpress_bak.sql.gz

2..3 分库备份的意义

        有时一个企业的数据库里会有多个库。例如 bbs、wordpress、bbs、blog 等,但是出问题的可能只是某一个库,如果在备份时把所有的库都备份成了一个数据库文件的话,恢复某个数据库的数据时就会比较麻烦。为了避免这个麻烦,需要分库备份。

3. 备份单个表练习 mysqldump 命令多种参数的使用

语法:mysqldump -u 用户名 -p 数据库名 表名 >备份的文件名

示例:mysqldump -uroot -p111111  oldboy student >/opt/table1.sql

详细的操作过程

[root@mysql-server scripts]# mysql -uroot -p111111

mysql> show databases;

mysql> use oldboy

mysql> show tables;

| Tables_in_oldboy |

| student      |

mysql> select * from student;

+----+-----------+

| id | name      |

+----+-----------+

|  1 | oldboy    |

|  2 | oldgirl     |

|  3 | inca        |

|  4 | zuma      |

|  5 | kaka       |

|  6 | 老男孩    |

|  7 | 老男孩    |

|  8 | 老男人    |

|  9 | 张雷        |

[root@mysql-server scripts]# mysqldump -uroot -p111111 --compact oldboy student

# --compact 参数可减少输出,展示备份数据的内容。

CREATE TABLE `student` (

  `id` int(4) NOT NULL AUTO_INCREMENT,

  `name` char(20) NOT NULL,

  PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=latin1;

/*!40101 SET character_set_client = @saved_cs_client */;

INSERT INTO `student` VALUES (1,'oldboy'),(2,'oldgirl'),(3,'inca'),(4,'zuma'),(5,'kaka'),(6,'老男孩'),(7,'老男孩'),(8,'老男人'),(9,'张雷');

[root@mysql-server scripts]# mysqldump -uroot -p111111  oldboy student >/opt/table_student.sql   #  备份。

root@mysql-server scripts]# ll /opt/table_student.sql

-rw-r--r-- 1 root root 2005 4月  11 01:03 /opt/table_student.sql

4. 备份多个表练习 mysqldump 命令多种参数的使用

4.1 将多个表备份成一个文件

语法:mysqldump -u 用户名 -p 数据库名 表名1 表名2 >备份的文件名

详细的操作过程

mysql> use oldboy

Database changed

mysql> create table test(id int);   #  在 oldboy 库再创建一个表(准备工作)。

mysql> show tables;          

| student       |

| test             |

[root@mysql-server ~]# mysqldump -uroot -p111111 --compact  oldboy student test

#  减少输出展示数据的内容。

CREATE TABLE `student` (

  `id` int(4) NOT NULL AUTO_INCREMENT,

  `name` char(20) NOT NULL,

  PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=latin1;

INSERT INTO `student` VALUES (1,'oldboy'),(2,'oldgirl'),(3,'inca'),(4,'zuma'),(5,'kaka'),(6,'老男孩'),(7,'老男孩'),(8,'老男人'),(9,'张雷');

CREATE TABLE `test` (

  `id` int(11) DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=latin1;

[root@mysql-server ~]# mysqldump -uroot -p111111  oldboy student test >/opt/table_stu_test.sql   #  备份。

[root@mysql-server ~]# ll /opt/table_stu_test.sql

-rw-r--r-- 1 root root 2504 4月  11 01:13 /opt/table_stu_test.sql

4.2 分表备份

        有时企业会有此类需求:一个库里有大表有小表,有时可能需要只恢复某一个小表,上述的多表备份文件很难拆开,就会像没有分库那样导致恢复某一个小表很麻烦,于是就需要进行分表备份。和分库备份的思路一样,每执行一条语句备份一个表,生成不同的数据文件即可。详细的脚本内容见 Shell 编程课程(略)。

分表备份的缺点:文件多而碎。

4.3 恢复数据的思路

① 备一个完整全备,再做一个分库分表备份(不适合数据量特别大的场景);

② 脚本批量恢复多个 SQL 文件。

4.4 备份数据库表结构及只备份数据

利用 mysqldump 的 -d 参数只备份表的结构,例如:备份 oldboy 库的所有表结构:

[root@mysql-server~] mysqldump -uroot -p'111111' --compact  -d oldboy    # 备份库下所有表结构。

CREATE TABLE `student` (

  `id` int(4) NOT NULL AUTO_INCREMENT,

  `name` char(20) NOT NULL,

  PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=latin1;

CREATE TABLE `test` (

  `id` int(11) DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=latin1;

[root@mysql-server ~]# egrep -v "#|\*|--|^$" /opt/t.sql

[root@mysql-server~]# mysqldump -uroot -p'111111' --compact  -d oldboy student

# 备份库下指定的 student 表的表结构。

CREATE TABLE `student` (

  `id` int(4) NOT NULL AUTO_INCREMENT,

  `name` char(20) NOT NULL,

  PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=latin1;

利用 -t 参数只备份表的数据,例如:备份 oldboy 库的 student 表数据:

[root@mysql-server ~]# mysqldump -uroot -p'111111' --compact -t oldboy student

INSERT INTO `student` VALUES (1,'oldboy'),(2,'oldgirl'),(3,'inca'),(4,'zuma'),(5,'kaka'),(6,'老男孩'),(7,'老男孩'),(8,'老男人'),(9,'张雷');

利用 mysqldump 的 -T 参数可以把表的结构和数据分开备份(不常用)。

利用 mysqldump 的 -A 参数可以备份数据库所有数据:

[root@mysql-server~]#mysqldump -uroot -p'111111' -A -B --events|gzip >/opt/a.sql.gz

5. mysqldump 关键参数补充

① 刷新 binlog 的参数 -F

[root@mysql-server ~]# vi /etc/my.cnf   #  编辑配置文件,打开 binlog 的注释。

log-bin=mysql-bin

[root@mysql-server ~]# /etc/init.d/mysqld restart   #  重启数据库。

[root@mysql-server ~]# mysqldump -uroot -p'111111' -A -B -F --events|gzip >/opt/a.sql.gz

[root@mysql-server ~]# ll /application/mysql/data/

-rw-rw---- 1 mysql mysql      856 4月  11 02:00 mysql-bin.000001

-rw-rw---- 1 mysql mysql      150 4月  11 02:00 mysql-bin.000002

-rw-rw---- 1 mysql mysql      150 4月  11 02:00 mysql-bin.000003

提示:每次刷新 binlog 备份,恢复数据时只需恢复全备及增量,增量前面的 binlog 是和全备重复的数据。

② 重要参数 --master-data    

[root@mysql-server ~]# mysqldump -uroot -p'111111' --master-data=1 --compact oldboy

CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000013', MASTER_LOG_POS=107;

#  使用 --master-data=1 参数,会自动指定 binlog 的文件和位置,这样就可以不切割日志,恢复数据时只需恢复该文件下的增量数据即可。(主从同步)

[root@mysql-server ~]# mysqlbinlog /application/mysql/data/mysql-bin.000013  #  查看 binlog 内容。

参数 --master-data 还可以等于 2:

[root@mysql-server ~]# mysqldump -uroot -p'111111' --master-data=2 --compact oldboy

-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000015', MASTER_LOG_POS=107;   #  前面多了注释。

6. mysqldump 命令关键参数说明

6.1 mysqldump --help 参数

        ① -B 指定多个库,增加建库语句和 use 语句;

        ② --compact 去掉注释,适合调试输出,生产场景不用该参数;

        ③ -A 备份所有库。

        ④ -F 刷新 binlog 日志;

        ⑤ --master-data  增加 binlog 日志文件名及对应的位置点;

        ⑥ -x,--lock-all-tables   锁表(保持数据一致性);

        ⑦ -l,--lock-tables  锁表(只读);

        ⑧ -d 只备份表结构;

        ⑨ -t  只备份数据;

        ⑩ 适合 InnoDB 事务数据库备份:--single-transaction

        InnoDB 表在备份时,通常启用选项 --single-transaction 来保证备份的一致性,实际上它的工作原理是设定本次会话的

隔离级别为:REPEATABLE READ 以确保本次会话(dump)时,不会看到其他会话已经提交了数据。

补充:--master-data

        --master-data=1:告诉从库应该从主库的哪个点进行增量恢复。

[root@mysql-server ~]# mysqldump -uroot -p111111 --master-data=1 --events oldboy student

CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000017', MASTER_LOG_POS=107;

        --master-data=2:

[root@mysql-server ~]# mysqldump -uroot -p111111 --master-data=2 --events oldboy student

-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000017', MASTER_LOG_POS=107;

 6.2 不同引擎的备份命令

        MyISAM 引擎的备份命令:

mysqldump -uroot -p111111 -A -B --master-data=2 -x --events|gzip >/opt/all.sql.gz

        InnoDB 引擎的备份命令:【推荐使用】

mysqldump -uroot -p111111 -A -B --master-data=2  --events --single-transaction|gzip >/opt/all.sql.gz

7. 恢复数据库实战

7.1 利用 source 命令恢复数据库      

[root@mysql-server ~]# mysql -uroot -p'111111'    #  登陆数据库。    

mysql> show databases;

|bbs                 |

| mysql            |

| oldboy           |

| oldboy_gbk   |

| oldboy_utf8   |

| wordpress     |

mysql> drop database oldboy;   # 删除 oldboy 库测试恢复。

mysql> show databases;

|bbs                 |

| mysql            |

| oldboy_gbk   |

| oldboy_utf8   |

| wordpress     |

mysql> system ls /opt   #  查看系统 /opt 下的备份文件。

mysql_bak_B.sql

mysql> source /opt/mysql_bak_B.sql   #  用 source 命令恢复数据库。

mysql> show databases;    #  查看恢复结果(恢复成功)。        

| bbs                  |

| mysql              |

| oldboy             |

| oldboy_gbk     |

mysql> set names latin1;

mysql> select * from oldboy.student;

| id | name      |

+----+-----------+

|  1 | oldboy    |

|  2 | oldgirl     |

|  3 | inca        |

|  4 | zuma      |

|  5 | kaka       |

|  6 | 老男孩    |

|  7 | 老男孩    |

|  8 | 老男人    |

|  9 | 张雷        |

提示:如果备份文件在登陆数据库前的路径下,source 命令可以直接在相对路径恢复数据。

7.2 标准的利用 mysql 命令恢复数据

[root@mysql-server ~]# cd /opt

[root@mysql-server opt]# gzip -d  mysql.sql.gz    #  加 -d 参数的解压会删除源文件。

[root@mysql-server opt]# ll mysql.sql.gz  

ls: 无法访问mysql.sql.gz: 没有那个文件或目录

[root@mysql-server opt]# mysql -uroot -p111111 </opt/mysql.sql   #  恢复数据。

7.3 分库分表备份的数据如何快速恢复

通过 Shell 脚本读指定的库和表,调用 mysql 命令恢复:

[root@mysql-server bak]# mysql -uroot -p'111111'

mysql> show databases;

bbs       

mysql       

oldboy         

oldboy_gbk

oldboy_utf8      

wordpress    

mysql> drop database bbs;   

mysql> drop database mysql;

mysql> drop database oldboy;

mysql> drop database oldboy_gbk;

mysql> drop database oldboy_utf8;

mysql> drop database wordpress;  

mysql> show databases;   #  数据库中没有上面的库了。         

| Database           |

| information_schema |

| performance_schema |

[root@mysql-server bak]# pwd

/opt/bak

[root@mysql-server bak]# gzip -d *   #  全部解压。

[root@mysql-server bak]# ls

bbs_bak.sql    oldboy_bak.sql      oldboy_utf8_bak.sql

mysql_bak.sql  oldboy_gbk_bak.sql  wordpress_bak.sql

[root@mysql-server bak]# ls *.sql|sed 's#_bak.sql##g'   #  取出库名。

bbs

mysql

oldboy

oldboy_gbk

oldboy_utf8

wordpress

[root@mysql-server bak]# for dbname in `ls *.sql|sed 's#_bak.sql##g'` ;do mysql -uroot -p'111111' < ${dbname}_bak.sql;done

#  通过 Shell 脚本 FOR 循环恢复数据库。

[root@mysql-server bak]# mysql -uroot -p'111111'  

mysql> show databases;    #  检查恢复结果(成功)。     

| Database          |

| bbs                    |

| mysql                |

| oldboy               |

| oldboy_gbk       |

| oldboy_utf8       |

| wordpress         |

mysql> set names latin1;

mysql> select * from oldboy.student;

| id | name      |

|  1 | oldboy    |

|  2 | oldgirl     |

|  3 | inca        |

|  4 | zuma      |

|  5 | kaka       |

|  6 | 老男孩    |

|  7 | 老男孩    |

|  8 | 老男人    |

|  9 | 张雷        |

8. MySQL 参数 -e 实现非交互式会话

mysql -uroot -p'111111' -e "show databases;"

[root@mysql-server ~]# mysql -uroot -p'111111' -e "set names latin1;use oldboy;select * from student;"

8.1 查看当前数据库的请求连接

[root@mysql-server ~]# mysql -uroot -p'111111' -e "show processlist;"

+----+--------+------------+---------+--------------+--------+--------+-----------------------+

| Id   | User  | Host       | db       | Command | Time | State |     Info                  |

+----+--------+------------+---------+---------------+-------+--------+-----------------------+

| 17  | root   | localhost | NULL | Query        |    0    | NULL | show processlist |

+----+--------+------------+---------+---------------+-------+-------+------------------------+

提示:如果两次甚至多次 show processlist 仍有一个语句还在,可能就是慢查询,可能就需要建索引。

[root@mysql-server ~]# mysql -uroot -p'111111' -e "show full processlist;"

+----+--------+------------+---------+--------------+--------+--------+---------------------------+

| Id   | User  | Host       | db       | Command | Time | State |     Info                       |

+----+--------+------------+---------+---------------+-------+--------+---------------------------+

| 17  | root   | localhost | NULL | Query        |    0    | NULL | show full processlist |

+----+--------+------------+---------+---------------+-------+-------+----------------------------+

8.2 查看 MySQL 的变量 

[root@mysql-server ~]# mysql -uroot -p'111111' -e "show variables;"

[root@mysql-server ~]# mysql -uroot -p'111111' -e "show variables;"|grep log_bin

log_bin ON    #  可以看到 log_bin 处于开启状态。

log_bin_trust_function_creators OFF

sql_log_bin     ON

[root@mysql-server ~]# grep log-bin /etc/my.cnf    # 和此处的参数对应。

log-bin=mysql-bin

8.3 查看 MySQL 的状态

[root@mysql-server ~]# mysql -uroot -p'111111' -e "show status;"   #  当前会话的状态。

[root@mysql-server ~]# mysql -uroot -p'111111' -e "show global status;"  #  查看全局状态。

root@mysql-server ~]# mysql -uroot -p'111111' -e "show global status;"|grep select

Com_select      51

[root@mysql-server ~]# mysql -uroot -p'111111' -e "show global status;"|grep insert

Com_insert      85

mysql> use oldboy

mysql> create table test(id int);

mysql> insert into test values(2);

mysql> show global status like '%insert%';

| Variable_name      | Value |

| Com_insert            | 86      |

mysql> insert into test values(3);        

mysql> show global status like '%insert%';

| Variable_name       | Value |

| Com_insert             | 87    |

8.4 数据库参数修改

不重启数据库修改数据库参数,但是要求重启后还能生效:

[root@mysql-server ~]# grep key_buffer /etc/my.cnf

key_buffer_size = 16K   #  MyISAM 引擎存放索引的缓冲区。

key_buffer_size = 8M

mysql> show variables like 'key_buffer%';

| Variable_name  | Value  |

| key_buffer_size | 16384 |

mysql> set global key_buffer_size=1024*1024*32;  把索引缓冲区改为 32M。

mysql> show variables like 'key_buffer%';      

| Variable_name   | Value        |

| key_buffer_size  | 33554432 |

mysql> Bye

[root@mysql-server ~]# mysql -uroot -p'111111'

mysql> show variables like 'key_buffer%';   #  退出再回来依旧生效。

| Variable_name   | Value    |

| key_buffer_size | 33554432 |

[root@mysql-server ~]# /etc/init.d/mysqld restart

mysql> show variables like 'key_buffer%';  #  可以看到重启后失效了。     

| Variable_name   | Value |

| key_buffer_size | 16384 |

所以要先在全局里面改,再改配置文件:此时无论是否重启都生效。

mysql> set global key_buffer_size=1024*32;

mysql> show variables like 'key_buffer%';

| Variable_name   | Value |

| key_buffer_size | 32768 |

[root@mysql-server ~]# vi /etc/my.cnf

[root@mysql-server ~]# grep key_buffer_size /etc/my.cnf        

key_buffer_size = 32K

8.5 生产场景常用命令小结

show status;                  查看当前会话的数据库状态信息。    

show global status;        查看整个数据库运行状态信息,需要分析并做好监控。(很重要)

show processlist;           查看正在执行的 SQL 语句,看不全。

show full processlist;      查看正在执行的完整 SQL 语句。

show variables;               查看数据库的参数信息,例如:my.cnf 里参数的生效情况。

set global key_buffer_size = 32777218  不重启服务直接生效,重启后失效。

8.6 其他相关知识

mysqlbinlog 命令作用:

        解析 MySQL 的 binlog 日志。

MySQL 的 binlog 日志的作用:

        用来记录 MySQL 内部增删改查等对 MySQL 数据库有更新的内容的记录。

恢复数据的多种方式:

        ①  截取 binlog 日志中指定的库的内容:-d 参数。

[root@mysql-server ~]# mysqlbinlog --help

 -d, --database=name List entries for just this database (local log only).

        例如:

mysqlbinlog -d oldboy nysql-bin.000020 >oldboy.sql

        ② 按照位置截取:

        例如:

mysqlbinlog mysqlbin.000020 --start-position=365  --stop-position=456 -r pos.sql

        ③ 按照时间截取:

        例如:

mysqlbinlog mysqlbin.000020 --start-datetime='2014-10-16 17:14:15'  --stop-datetime='2014-10-16 17:15:15' -r time.sql

binlog 功能的打开:

[root@mysql-server ~]# grep mysql-bin /etc/my.cnf

log-bin=mysql-bin   #  该行去掉注释(放在 [mysqld]下面)。

猜你喜欢

转载自www.cnblogs.com/alinuxer/p/9887348.html