Mysql DBA 高级运维学习笔记-Mysql增量备份及数据恢复实战

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql DBA 高级运维学习笔记-Mysql增量备份及数据恢复实战相关的知识,希望对你有一定的参考价值。

大家好本文讲了mysql数据库的增量恢复。老男孩老师讲的很好很细,我自己呢整理了老师讲的部分内容,请大家将就看;文章内容比较多、比较乱,请大家认真总结知识,发现问题请及时批评指点~

1.1 MySQL数据库的备份与恢复

1.1.1备份单个数据库练习多种参数使用

Mysql数据库自带了一个很好用的备份命令,就是mysqldump, 它的基本使用如下:

语法:mysqldump –u用户名 –p密码 数据库名>备份的文件名

范烈1:备份名字为cuizhong的库

a.查看备份前的数据

[[email protected]~]# mysql -uroot -p123456  --default-character-set=latin1 -e "select * from cuizhong.student;"
+----+-----------+
| id | name  |
+----+-----------+
|  1 | zhangsan  |
|  2 | lisi  |
|  3 | wanger|
|  4 | xiaozhang |
|  5 | xiaowang  |
|  6 | ???   |
|  7 | 小红|
|  8 | 不认识 |
|  9 | 李四|
+----+-----------+

b.执行备份命令

[[email protected]~]#mysqldump –uroot -p123456 cuizhong >/opt/mysql_bak.sql

c. 检查备份结果

[[email protected] ~]# 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,‘zhangsan‘),(2,‘lisi‘),(3,‘wanger‘),(4,‘xiaozhang‘),(5,‘xiaowang‘),(6,‘???‘),(7,‘?°?o¢‘),(8,‘??è?¤èˉ?‘),(9,‘?????‘);
UNLOCK TABLES;

范烈2:设置字符集参数备份解决乱码问题

a.查看备份前数据库客户端及服务器短的字符集设置

[[email protected] ~]# mysql -uroot -p123456 -e "show variables like ‘character_set%‘;"
+--------------------------+----------------------------------+
| Variable_name| Value|
+--------------------------+----------------------------------+
| character_set_client | latin1   |
| character_set_connection | latin1   |
| character_set_database   | latin1   |
| character_set_filesystem | binary   |
| character_set_results| latin1   |
| character_set_server | latin1   |
| character_set_system | utf8 |
| character_sets_dir   | /usr/local/mysql/share/charsets/ |
+--------------------------+----------------------------------+

b.指定字符集备份,这里为—default-character-set=latinl

mysqldump -uroot -p123456  --default-character-set=latin1 cuizhong>/opt/mysql_bak.sql

执行结果:

[[email protected]~]#mysqldump-uroot-p123456  --default-character-set=latin1 cuizhong>/opt/mysql_bak.sql
[[email protected] ~]# 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,‘zhangsan‘),(2,‘lisi‘),(3,‘wanger‘),(4,‘xiaozhang‘),(5,‘xiaowang‘),(6,‘???‘),(7,‘小红‘),(8,‘不认识‘),(9,‘李四‘);
UNLOCK TABLES;

恢复测试:

[[email protected] ~]# mysql -uroot -p123456 -e "use cuizhong;drop table student;"
[[email protected] ~]# mysql -uroot -p123456 cuizhong </opt/mysql_bak.sql
[[email protected]~]# mysql -uroot -p123456 -e "select * from cuizhong.student;"
+----+-----------+
| id | name  |
+----+-----------+
|  1 | zhangsan  |
|  2 | lisi  |
|  3 | wanger|
|  4 | xiaozhang |
|  5 | xiaowang  |
|  6 | ???   |
|  7 | 小红|
|  8 | 不认识 |
|  9 | 李四|
+----+-----------+

范例3:备份时加-B参数

和前面的备份文件对比,看看-B的作用

[[email protected] ~]# cd /opt/
[[email protected] opt]# diff mysql_bak.sql mysql_bak_B.sql 
18a19,26
> -- Current Database: `cuizhong`
> --
> 
> CREATE DATABASE /*!32312 IF NOT EXISTS*/ `cuizhong` /*!40100 DEFAULT CHARACTER SET latin1 */;   加了一个创建库的语句
> 
> USE `cuizhong`;  加了一个USE                    
> 
> --
51c59
< -- Dump completed on 2018-01-30  4:05:37
---
> -- Dump completed on 2018-01-30  4:18:06

提示:-B参数的作用是增加创建数据库和连接数据库的命令,即下面两条语句:

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

利用-B的备份进行恢复测试:

(1)删除cuizhong库

mysql> show databases;
+--------------------+
| Database   |
+--------------------+
| information_schema |
| cuizhong   |
| mysql  |
| performance_schema |
| zbf|
+--------------------+
6    rows in set (0.00 sec)
mysql> drop databases cuizhong;
mysql> show databases;
+--------------------+
| Database   |
+--------------------+
| information_schema |
| mysql  |
| performance_schema |
| zbf|
+--------------------+

(2)恢复数据

先用不带-B参数的sql文件恢复

[[email protected] opt]# mysql -uroot -p123456 cuizhong </opt/mysql_bak.sql 
ERROR 1049 (42000): Unknown database ‘cuizhong‘

带-B参数恢复

[[email protected] opt]# mysql -uroot -p123456 </opt/mysql_bak_B.sql
[[email protected] opt]# mysql -uroot -p123456 -e "select * from cuizhong.student;"
+----+-----------+
| id | name  |
+----+-----------+
|  1 | zhangsan  |
|  2 | lisi  |
|  3 | wanger|
|  4 | xiaozhang |
|  5 | xiaowang  |
|  6 | ???   |
|  7 | 小红|
|  8 | 不认识 |
|  9 | 李四|
+----+-----------+

范例4:用—compact备份

--compact参数说明

测试时用的比较多,可以优化输出的内容,让容量更少适合调适。

[[email protected] opt]# mysqldump -uroot -p123456 --compact -B cuizhong >/opt/mysql_bak_B_compact.sql

范例5:指定压缩命令压缩备份mysql数据

[[email protected] opt]# mysqldump -uroot -p123456 -B cuizhong|gzip >/opt/mysql_bak.sql.gz
[[email protected] opt]# ll |grep mysql_bak.s
 -rw-r--r--. 1 root root 2001 1月  30 04:05 mysql_bak.sql
 -rw-r--r--. 1 root root  858 1月  30 05:03 mysql_bak.sql.gz

压缩速率近3倍

通过上面例子我们可以得出结论

1.导出数据用B参数。

2.用gzip对备份的数据进行压缩。

1.1.2 Mysqldump的工作原理?

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

备份的数据过滤注释都是sql语句,结果如下:

[[email protected] opt]# egrep -v "#|\*|--|^$" /opt/mysql_bak_B.sql 
USE `cuizhong`;
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,‘zhangsan‘),(2,‘lisi‘),(3,‘wanger‘),(4,‘xiaozhang‘),(5,‘xiaowang‘),(6,‘???‘),(7,‘小红‘),(8,‘不认识‘),(9,‘李四‘);
UNLOCK TABLES;

1.1.3 备份多个库及多个参数

(1)备份多个库,多个库之间用你空格分开

[[email protected] opt]# mysqldump -uroot -p123456 -B zbf cuizhong|gzip >/opt/mysql.sql.gz

(2)-B参数说明

-B参数最关键是表示多个库并且增加user db和create database db 的信息

生产常用:

-B, --databases Dump several databases. Note the difference in usage; in this case no tables are given. All name arguments are regarded as database names. ‘USE db_name;‘ will be included in the output.

参数说明:

改参数用于导出若干数据在备份结果中会加入create databases db和 use db.-B后面的参数将被作为数据名,-B参数比较常用当-B后的库列全时同-A参数。

1.1.4 如何做分库备份

分库备份实质就是执行一个sql语句备份一个库,如果数据库里有多个库就执行多条相同的备份单个库的备份语句就可以备份多个库了,,注意每个库都可以用备份的库作为库名结尾加.sql,备份命令如下:

Mysql –uroot –p123456 –B cuizhong ….
Mysql –uroot –p123456 –B cuizhong_gbk
….

将上述命令放在一个脚本里,就是一个很土的备份脚本了,更详细的可以点击下方网址学习。

http://edu.51cto.com/course/808.html

如果数据数据库里面有很多库,不知道库的名称怎么办呢?我们可以用grep把所有的库筛选出来。

[[email protected] ~]# mysql -uroot -p123456 -e "show databases;"|grep -Evi "databa|info|per"|sed ‘s#^#mysqldump -uroot -p123456 -B #g‘
mysqldump -uroot -p123456 -B cuizhong
mysqldump -uroot -p123456 -B mysql
mysqldump -uroot -p123456 -B zbf

执行一条命令分库备份实战

[[email protected] ~]# mysql -uroot -p123456 -e "show databases;"|grep -Evi "databa|info|per"|sed -r ‘ s#^([a-z].*$)#mysqldump -uroot -p123456 --events -B \1|gzip>/opt/bak/\1.sql.gz#g‘
cuizhong|gzip>/opt/bak/cuizhong.sql.gz
mysqldump -uroot -p123456 --events -B mysql|gzip>/opt/bak/mysql.sql.gz
mysqldump -uroot -p123456 --events -B zbf|gzip>/opt/bak/zbf.sql.gz

[[email protected] ~]# mysql -uroot -p123456 -e "show databases;"|grep -Evi "databa|info|per"|sed -r ‘ s#^([a-z].*$)#mysqldump -uroot -p123456 --events -B \1|gzip>/opt/bak/\1.sql.gz#g‘|bash

[[email protected] ~]# ll /opt/bak/

总用量 152
-rw-r--r--. 1 root root874 1月  30 21:52 cuizhong.sql.gz
-rw-r--r--. 1 root root 144238 1月  30 21:52 mysql.sql.gz
-rw-r--r--. 1 root root795 1月  30 21:52 zbf.sql.gz

也可以用简单的脚本实现分库备份

[[email protected] ~]# cat beifen.sh 
#/bin/bash
for dbname in `mysql -uroot -p123456 -e "show databases;"|grep -Evi "databa|info|per"`
do
    mysqldump -uroot -p123456 --events -B $dbname|gzip>/opt/bak/${dbname}_bak.sql.gz
done
[[email protected] ~]# ll /opt/bak/
总用量 152
-rw-r--r--. 1 root root874 1月  30 22:44 cuizhong_bak.sql.gz
-rw-r--r--. 1 root root 144238 1月  30 22:44 mysql_bak.sql.gz
-rw-r--r--. 1 root root795 1月  30 22:44 zbf_bak.sql.gz

分库备份缺点:文件多,很碎

(1)备一个完整全备,在做一个分库分表备份。

(2)脚本批量恢复多个SQL文件。

1.1.5 备份数据库表结构(不包含数据)

利用mysqldump –d 参数只备份表结构,例如备份cuizhong的所有表结构

[[email protected] ~]# mysqldump -uroot -p123456 --compact -d cuizhong student
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
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 */;

也可以用mysqldump –t 参数备份表数据,-t相当于—no-create-info

[[email protected] ~]# mysqldump -uroot -p123456 --compact -t cuizhong student
INSERT INTO `student` VALUES (1,‘zhangsan‘),(2,‘lisi‘),(3,‘wanger‘),(4,‘xiaozhang‘),(5,‘xiaowang‘),(6,‘???‘),(7,‘小红‘),(8,‘不认识‘),(9,‘李四‘);

更多用法课题执行mysqldump –-help查询。

1.1.6 刷新binlog参数

-F 刷新binlog参数防止以后重复恢复数据。

(1)在my.cnf中开启bin-log

[[email protected] ~]# cat /etc/my.cnf|grep log-bin
log-bin=mysql-bin

(2)重启mysql数据库

[[email protected] ~]# /etc/init.d/mysqld restart
Shutting down MySQL.. SUCCESS! 
Starting MySQL.^[[A. SUCCESS!

(3)重启完我们再查看一下mysql数据文件目录

我们发现出现了mysql-bin.000001,它记录了mysql修改过的数据。

[[email protected] ~]# ll /usr/local/mysql/data/
总用量 28720
drwx------. 2 mysql mysql 4096 1月  30 04:32 cuizhong
 -rw-rw----. 1 mysql mysql 18874368 1月  31 04:10 ibdata1
 -rw-rw----. 1 mysql mysql  5242880 1月  31 04:10 ib_logfile0
 -rw-rw----. 1 mysql mysql  5242880 1月  28 23:08 ib_logfile1
 -rw-r-----. 1 mysql root 17406 1月  31 04:10 localhost.localdomain.err
 -rw-rw----. 1 mysql mysql5 1月  31 04:10 localhost.localdomain.pid
drwx------. 2 mysql root  4096 1月  28 23:07 mysql
 -rw-rw----. 1 mysql mysql  107 1月  31 04:10 mysql-bin.000001
 -rw-rw----. 1 mysql mysql   19 1月  31 04:10 mysql-bin.index
drwx------. 2 mysql mysql 4096 1月  28 23:07 performance_schema
drwx------. 2 mysql mysql 4096 1月  28 23:15 zbf

(4)用-F参数刷新binlog备份数据库

[[email protected] ~]# mysqldump -uroot -p123456 -A -B -F --events|gzip >/opt/all.sql.gz

(5)在查看mysql数据文件目录

 [[email protected] ~]# ll /usr/local/mysql/data/
 总用量 28736
 drwx------. 2 mysql mysql 4096 1月  30 04:32 cuizhong
 -rw-rw----. 1 mysql mysql 18874368 1月  31 04:10 ibdata1
 -rw-rw----. 1 mysql mysql  5242880 1月  31 04:10 ib_logfile0
 -rw-rw----. 1 mysql mysql  5242880 1月  28 23:08 ib_logfile1
 -rw-r-----. 1 mysql root 17406 1月  31 04:10 localhost.localdomain.err
 -rw-rw----. 1 mysql mysql5 1月  31 04:10 localhost.localdomain.pid
 drwx------. 2 mysql root  4096 1月  28 23:07 mysql
 -rw-rw----. 1 mysql mysql  150 1月  31 04:10 mysql-bin.000001
 -rw-rw----. 1 mysql mysql  150 1月  31 04:10 mysql-bin.000002
 -rw-rw----. 1 mysql mysql  150 1月  31 04:10 mysql-bin.000003
 -rw-rw----. 1 mysql mysql  107 1月  31 04:10 mysql-bin.000004
 -rw-rw----. 1 mysql mysql   76 1月  31 04:10 mysql-bin.index
 drwx------. 2 mysql mysql 4096 1月  28 23:07performance_schema
 drwx------. 2 mysql mysql 4096 1月  28 23:15 zbf

1.1.7 最小化参数备份mysql数据库

--master-data 最小化备份mysql数据库直接找到binlog的位置,用最小化参数就不用切割日志了,增量恢复数据知道这个binlog的位置就行了。

--master-data的值等于1时

[[email protected] ~]# mysqldump -uroot -p123456 --master-data=1 --compact cuizhong
CHANGE MASTER TO MASTER_LOG_FILE=‘mysql-bin.000007‘, MASTER_LOG_POS=107;

--master-data的值等于2时会在CHANGE MASTER TO MASTER_LOG_FILE前面加注释,恢复数据的时候就不执行了

[[email protected] ~]# mysqldump -uroot -p123456 --master-data=2 --compact cuizhong
 -- CHANGE MASTER TO MASTER_LOG_FILE=‘mysql-bin.000007‘, MASTER_LOG_POS=107;

1.1.8 Mysqldump的关键参数说明

关键参数:mysqldump –-help

  1. –B指定多个库,增加建库语句和use语句。

  2. –compact 去掉注释适合调适输出,生产不用

  3. –A所有库

  4. –F刷新binlog日志

  5. –master-data 增加binlog日志文件名及对应的位置点

  6. –x ,--lock-all-tables 锁表

  7. –l ,--lock-tables Lock all for read

  8. –d 只备份表结构

  9. –t 备份shuju

  10. –-single-transaction 适合innodb事务数据库备份

InnoDB表在备份时,通常启用—single-transaction 来保证备份的一致性,实际上它的工作原理是设置本次会话的隔离级为REPEATABLE READ 以确保本次会话(dump)时,不会看到其他会话已经提交的数据。

http://imysql.cn/2008_10_24_deep_into_mysqldump_options

1.1.9 生产场景常规备份

Myisam引擎备份命令:

Mysqldump –uroot –p123456 –A –B –F –-master-data=2 –x –events |gzip >/opt/all.sql.gz

Inoodb引擎备份命令:推荐使用

Mysqldump –uroot –p123456 –A –B –F –-master-data=2 –single-transaction --events|gzip >/opt/all.sql.gz

混合引擎以myisam引擎备份为主

1.2 恢复数据实践

1.2.1 用source命令恢复数据库

进入mysql数据库控制台,mysql –u root –p登陆后,然后用source 命令后面加备份的兼备文件的路径。

实战演练:

a.进入mysql控制台删掉数据库cuizhong模拟数据恢复

mysql> show databases;
+--------------------+
| Database   |
+--------------------+
| information_schema |
| cuizhong   |
| mysql  |
| performance_schema |
| zbf|
+--------------------+
5 rows in set (0.01 sec)

mysql> drop database cuizhong
-> ;
Query OK, 1 row affected (0.12 sec)

mysql> show databases;
+--------------------+
| Database   |
+--------------------+
| information_schema |
| mysql  |
| performance_schema |
| zbf|
+--------------------+
4 rows in set (0.01 sec)

b.用system找一下我们之前的备份的文件,也可以退出控制台用-e参数

mysql> system ls /opt/
all.sql.gz  cuizhong.sql mysql_bak_B_compact.sql  mysql_bak.sql    mysql.sql zbf.sql
bak    cuizhong.sql.gz  mysql_bak_B.sql      mysql_bak.sql.gz    mysql.sql.gz  zbf.sql.gz

c.用source恢复数据,查看一下cuizhong库

mysql> source /opt/mysql_bak_B.sql
Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)
…省略……

看数据已经恢复了

mysql> select * from cuizhong.student;
+----+-----------+
| id | name  |
+----+-----------+
|  1 | zhangsan  |
|  2 | lisi  |
|  3 | wanger|
|  4 | xiaozhang |
|  5 | xiaowang  |
|  6 | ???   |
|  7 | 小红|
|  8 | 不认识 |
|  9 | 李四|
+----+-----------+

1.2.2 利用mysql命令恢复(标准)

[[email protected] opt]# mysql -uroot -p123456 -e "use zbf;drop table student;show tables;"
ERROR 1051 (42S02) at line 1: Unknown table ‘student‘
[[email protected] opt]# mysql -uroot -p123456 zbf</opt/zbf_bak.sql
[email protected] opt]# mysql -uroot -p123456
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 24
Server version: 5.5.32-log Source distribution

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type ‘help;‘ or ‘\h‘ for help. Type ‘\c‘ to clear the current input statement.

mysql> use zbf
Database changed
mysql> show tables;+---------------+
| Tables_in_zbf |
+---------------+
| student   |
+---------------+
1 row in set (0.00 sec)

问题:分库分表备份的数据如何快速恢复?

通过脚本指定库和表,指定mysql恢复。

(1)删除cuizhong和zbf库。

[[email protected] bak]# mysql -uroot -p123456 -e "drop database cuizhong;drop database zbf"
[[email protected] bak]# mysql -uroot -p123456 -e "show databases;"
+--------------------+
| Database   |
+--------------------+
| information_schema |
| mysql  |
| performance_schema |
+--------------------+

(2)如果数据库比较多不知道库名可以用mysql的-e参数筛选也可以筛选备份的文件得到库名

[[email protected] bak]# gzip -d *
[[email protected] bak]# ls
cuizhong_bak.sql  zbf_bak.sql
[[email protected] bak]# ls *.sql|awk -F "_" ‘ {print $1}‘
cuizhong
zbf

或者用sed命令

[[email protected] bak]# ls *.sql|sed ‘ s#_bak.sql##g‘
cuizhong
zbf

(3)执行脚本分库分表恢复数据

[[email protected] bak]# for dbname in `ls *.sql|sed ‘ s#_bak.sql##g‘`;do mysql -uroot -p123456 < ${dbname}_bak.sql;done
[[email protected] bak]# mysql -uroot -p123456 -e "show databases;"
+--------------------+
| Database   |
+--------------------+
| information_schema |
| cuizhong   |
| mysql  |
| performance_schema |
| zbf|
+--------------------+

2.Mysql 带-e参数实现非交互式对话

2.1 恢复mysql数据

[[email protected] bak]# mysql -uroot -p123456 -e "truncate table cuizhong.student;"
[[email protected] bak]# mysql -uroot -p123456 -e "select * from cuizhong.student;"
[[email protected] bak]# mysql -uroot -p123456 cuizhong </opt/bak/
cuizhong_bak.sql  zbf_bak.sql   
[[email protected] bak]# mysql -uroot -p123456 cuizhong </opt/bak/cuizhong_bak.sql 
[[email protected] bak]# mysql -uroot -p123456 -e "select * from cuizhong.student;"
+----+-----------+
| id | name  |
+----+-----------+
|  1 | zhangsan  |
|  2 | lisi  |
|  3 | wanger|
|  4 | xiaozhang |
|  5 | xiaowang  |
|  6 | ???   |
|  7 | 小红|
|  8 | 不认识 |
|  9 | 李四|
+----+-----------+

(1)查看当前数据库有多少人连接

[[email protected] bak]# mysql -uroot -p123456 -e "show processlist;"
+----+------+-----------+------+---------+------+-------+------------------+
| Id | User | Host  | db   | Command | Time | State | Info |
+----+------+-----------+------+---------+------+-------+------------------+
| 46 | root | localhost | NULL | Query   |0 | NULL  | show processlist |
+----+------+-----------+------+---------+------+-------+------------------+
[[email protected] bak]# mysql -uroot -p123456 -e "show processlist\G"
*************************** 1. row ***************************
 Id: 47
   User: root
   Host: localhost
 db: NULL
Command: Query
   Time: 0
  State: NULL
   Info: show processlist

(2)查看mysql的所有参数配置

[[email protected] bak]# mysql -uroot -p123456 -e "show variables;"

比如我们查看binlog日志有没有开启

[[email protected] bak]# mysql -uroot -p123456 -e "show variables;"|grep log_bin
log_bin    ON
log_bin_trust_function_creators    OFF
sql_log_bin    ON

(3)查看mysql数据库的状态

Show stutas查看当前会话的状态

[[email protected] bak]# mysql -uroot -p123456 -e "show status;"

查看全局状态show global status,列如:查看select多少次。

[[email protected] bak]# mysql -uroot -p123456 -e "show  global status;"|grep sel
Com_insert_select    0
Com_replace_select    0
Com_select    205

通过看上面的结果我们已经select查询了205次,接下来我在查询一次

[[email protected] bak]# mysql -uroot -p123456 -e "select * from cuizhong.student;"
+----+-----------+
| id | name  |
+----+-----------+
|  1 | zhangsan  |
|  2 | lisi  |
|  3 | wanger|
|  4 | xiaozhang |
|  5 | xiaowang  |
|  6 | ???   |
|  7 | 小红|
|  8 | 不认识 |
|  9 | 李四|
+----+-----------+
[[email protected] bak]# mysql -uroot -p123456 -e "show  global status;"|grep sel
Com_insert_select    0
Com_replace_select    0
Com_select    208

这里显示的次数是208次,包括自己查询。也可以查看insert ,update等的状态。

也可以登录mysql查看

mysql> show global status like "%sele%";
+------------------------+-------+
| Variable_name  | Value |
+------------------------+-------+
| Com_insert_select  | 0 |
| Com_replace_select | 0 |
| Com_select | 209   |
| Select_full_join   | 0 |
| Select_full_range_join | 0 |
| Select_range   | 0 |
| Select_range_check | 0 |
| Select_scan| 279   |
+------------------------+-------+

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

(1) 查看一下key_buffer_size,配置文件my.cnf里的key_buffer_size是myisam引擎存放索引的缓冲区。

[[email protected] bak]# grep  key_buffer /etc/my.cnf 
key_buffer_size = 16K
key_buffer_size = 8M
[mysqld]
#character-set-server = utf8
port= 3306
socket  = /usr/local/mysql/tmp/mysql.sock
skip-external-locking
#myisam引擎存放索引的缓冲区
key_buffer_size = 16K
max_allowed_packet = 1M

(2) 登录mysql全局修改key_buffer_size

mysql> show variables like ‘key_buffer%‘;
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| key_buffer_size | 16384 |
+-----------------+-------+
1 row in set (0.00 sec)
mysql> set global key_buffer_size=1024*1024*32;
Query OK, 0 rows affected (0.11 sec)
mysql> show variables like ‘key_buffer%‘;
+-----------------+----------+
| Variable_name   | Value|
+-----------------+----------+
| key_buffer_size | 33554432 |
+-----------------+----------+
1 row in set (0.00 sec)

(3) 退出mysql重启mysql服务,再查看一下key_buffer_size的值

[[email protected] bak]# mysql -uroot -p123456 -e "show variables like ‘key_buffer%‘;";
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| key_buffer_size | 16384 |
+-----------------+-------+

重启完mysql服务之后key_buffer_size的值有变为16k了,所以全局修改mysql参数最好的方法就是全局和配置文件都要修改,这样就会永久生效。

mysql> show variables like ‘key_buffer%‘;
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| key_buffer_size | 16384 |
+-----------------+-------+
1 row in set (0.00 sec)
mysql> set global key_buffer_size=1024*1024*32;
Query OK, 0 rows affected (0.01 sec)

[[email protected] bak]vim /etc/my.cnf
....省略....
#myisam引擎存放索引的缓冲区
key_buffer_size = 32M

重启mysql服务再查看key_buffer_size的值

[[email protected] bak]# /etc/init.d/mysqld restart
Shutting down MySQL. SUCCESS! 
Starting MySQL.. SUCCESS! 
[[email protected] bak]# mysql -uroot -p123456 -e "show variables like ‘key_buffer%‘;";
+-----------------+----------+
| Variable_name   | Value|
+-----------------+----------+
| key_buffer_size | 33554432 |
+-----------------+----------+

这次我们看重启mysql服务key_buffer_size的值也不会变了。

小结:生产常用命令

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

  2. Show global status; 查看整个数据库运行的状态,很重要要分析并要做好监控。

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

  4. Show full processlist;查看正在执行的完整的SQL语句,完整显示。

  5. set global key_buffer_size=1024102432不重启数据库调整数据库参数,直接生效,重启后失效。

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

3.生产环境实例

3.1 mysql数据库批量插入数据shell脚本实现

可以阅读老男孩老师的博客

http://blog.51cto.com/oldboy/597511

http://blog.51cto.com/10642812

3.2 不登录数据库执行mysql命令小结

http://blog.51cto.com/oldboy/632608

4.Mysqlbinlog命令介绍

4.1 mysqlbinlog是什么?

mysqlbinlog是解析mysql的binlog日志。在my.cnf配置文件里打开binlog。

[[email protected] data]# grep log-bin /etc/my.cnf 
log-bin=mysql-bin

4.2 那么mysql的binlog日志是什么呢

数据目录下的文件就是mysql的binlog

[[email protected] bak]# cat /usr/local/mysql/data/mysql-bin.index 
./mysql-bin.000001
./mysql-bin.000002
./mysql-bin.000003
./mysql-bin.000004
./mysql-bin.000005
./mysql-bin.000006
./mysql-bin.000007
./mysql-bin.000008
./mysql-bin.000009
./mysql-bin.000010

4.3 Mysql的日志的作用是什么呢?

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

4.4 Mysqlbinlog的-d参数拆分binlog日志,截取指定库的binlog。

Binlog日志里记录了所有库更新的内容的记录,在恢复数据库时不能把所有库更新的内容全部恢复会报错,因为不是所有库都出故障。

-d参数指定想要恢复的库

mysqlbinlog --no-defaults -d linzhongniao mysql-bin.000011 >linzhongniao.sql

更多的参数可以mysqlbinlog –help查看

4.5 基于位置的增量恢复

4.5.1 指定开始位置和结束位置

我们先less查看一下mysql-bin.000011,我只把下图中带insert的部分备份出来,下图告诉了我们开始位置、时间和结束位置。如果只指定开始位置截取从开始位置到结尾。

技术分享图片

实践:-r相当于重定向

[[email protected] data]# mysqlbinlog --no-defaults mysql-bin.000011 --start-position=906 --stop-position=1051 -r pos.sql

4.6 基于时间点的增量恢复(基于时间就不准确了)

4.6.1 指定开始时间和结束时间

比如我想恢复180201 2:45:16到180201 2:47:01之间的数据。

技术分享图片

实践:

[[email protected] data]# mysqlbinlog --no-defaults mysql-bin.000011 --start-datetime=‘2018-02-01 2:45:16‘ --stop-datetime=‘2018-02-01 2:47:01‘ -r time.sql

比如说谁谁谁在几点用drop删除了一条记录,那我们在恢复数据的时候就要把这个时间段跳过去。

4.7 mysql增量恢复企业实战

mysql增量恢复企业实战请阅读老男孩老师博文

http://blog.51cto.com/oldboy/1431161

http://blog.51cto.com/oldboy/1431172

以上是关于Mysql DBA 高级运维学习笔记-Mysql增量备份及数据恢复实战的主要内容,如果未能解决你的问题,请参考以下文章

Mysql DBA 高级运维学习笔记-Mysql插入中文乱码问题

Mysql DBA 高级运维学习笔记-Mysql常用基础命令实战

Mysql DBA 高级运维学习笔记-MySQL5.5编译方式安装实战

Mysql DBA 高级运维学习笔记-MySQL主从复制故障解决

Mysql DBA 高级运维学习笔记-删除表中数据

Mysql DBA 高级运维学习笔记-Mysql常见多实例配置方案及多实例安装