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]下面)。