1.1.mysqldump进行逻辑备份单个库
mysql数据库自带了mysqldump备份命令,其语法为:
mysqldump -u 用户名 -p 数据库名 >备份的文件名
例如:备份名为data_default的库
mysql -uroot -p123456 -e "use data_default;show tables;select * from student"#在linux命令行查看mysql库中的表内容
mysqldump -uroot -p123456 data_default >/opt/mysql_bak.sql #备份到/opt/mysql_bak.sql
mysqldump -uroot -p123456 --default-character=utf-8 data_default >/opt/mysql_bak.sql #指定字符集导出以免乱码。或者--default-character-set=utf8
egrep -v "^$|--|#|\*" /opt/mysql_bak.sql #查看备份
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` char(15) NOT NULL,
`age` tinyint(2) NOT NULL DEFAULT '0',
`dept` varchar(16) DEFAULT NULL,
`sex` char(2) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `index_dept` (`dept`(8))
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;#建表的语句
LOCK TABLES `student` WRITE;#上锁
INSERT INTO `student` VALUES (1,'lily',0,NULL,NULL); #插入语句
UNLOCK TABLES;
#mysql带-e参数实现非交互式对话
例如:
[root@localhost ~]# mysql -uroot -p123456 -e "select * from data_default.student"
实际上用mysqldump备份,是把SQL语句备份下来(不记录查找的语句),然后删除原来的表重新操作。
备份时加入-B,可以自动建库。
mysqldump -uroot -p123456 -B data_default >/opt/mysql_bak_b.sql #备份到/opt/mysql_bak_b.sql。
下面比较一下两个备份区别:
diff /opt/mysql_bak.sql /opt/mysql_bak_b.sql
18a19,26
-- Current Database: `data_default`
--
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `data_default` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `data_default`;
--
55c63
-- Dump completed on 2019-06-27 5:22:30
---
-- Dump completed on 2019-06-27 5:48:49
发现多了一个create语句和use语句,加上-B参数的作用是增加创建数据库和链接数据库命令。恢复命令与不加B的不同:
mysql -uroot -p123456
指定压缩命令来备份数据库:
mysqldump -uroot -p123456 --default-character=utf-8 -B data_default|gzip>/opt/mysql_bak_b.sql.gz #gzip压缩命令来压缩
1.2 备份多个库
备份命令:
mysqldump -uroot -p123456 --default-character=utf-8 -B data_default test|gzip>/opt/mysql_bak_b.mul.sql.gz #备份data_default和 test两个库
备份所有库:
mysql -uroot -p123456 -e "show databases;" |egrep -vi "database|information_schema| performance_schema|test"|sed 's#^([a-z].*$)#mysqldump -uroot -p123456 -default-character=utf-8 --events -B \1 |gzip >/opt/\1.sql.gz#g' |bash
或者
for dbname in `mysql -uroot -p123456 -e "show databases;" |egrep -vi "database|information_schema| performance_schema|test"`
do
mysqldump -uroot -p123456 -default-character=utf-8 --events -B $dbname|gzip >/opt/bak/${dbname}_bak.sql.gz
1.3 mysqldump备份表
备份单个表:
语法:mysqldump -u 用户名 -p 密码 数据库名 表名 >备份的文件名。
例如:
mysqldump -uroot -p123456 data_default student >/opt/tables.sql
#注意这里不能加-B参数,因为库后面就是表。
备份多个表:
语法:mysqldump -u 用户名 -p 密码 数据库名 表名1 表名2 >备份的文件名
例如:
mysqldump -uroot -p123456 data_default test student >/opt/tables.sql
总结:如果一个库里既有大表又有小表,如果只恢复某一小表,则最好每个表备份成一个数据文件。例如
mysqldump -uroot -p123456 data_default test >/opt/test.sql
mysqldump -uroot -p123456 data_default test1 >/opt/test1.sql
1.4 利用mysqldump -d只备份表结构
例如:备份data_default库所有表结构
mysqldump -uroot -p123456 -B -d data_default >/opt/data.sql
备份表结构:
mysqldump -uroot -p123456 -d data_default test >/opt/test.sql
1.5 利用mysqldump -t只备份表数据
mysqldump -uroot -p123456 -t data_default test >/opt/test.sql
1.6利用mysqldump -A备份数据库所有数据
例如:
mysqldump -uroot -p123456 -A -B --events|gzip >/opt/mysql.sql.gz
1.7利用mysqldump -F(-flush-logs)备份数据库自动切割bin-log,产生一个新的mysql-bin.00000X 文件,记录备份后对数据库所有的DDL和DML语句。
mysqldump -uroot -p123456 -A -B -F --events|gzip >/opt/mysql.sql.gz
1.8利用mysqldump --master-data=1备份数据库
–master-data=1 在备份语句里添加CHANGE MASTER语句以及binlog文件及位置点信息,这样就不需要切割bin-log,可以直接找到备份位置。
mysqldump -uroot -p123456 --master-data=1 --compact data_default >/opt/data1.sql
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000005', MASTER_LOG_POS=1373; #告诉位置,当前备份的是pos为1373以前的,包括1373.
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `student` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` char(15) NOT NULL,
`age` tinyint(2) NOT NULL DEFAULT '0',
`dept` varchar(16) DEFAULT NULL,
`sex` char(2) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `index_dept` (`dept`(8))
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
INSERT INTO `student` VALUES (1,'shitan',0,NULL,NULL);
mysqldump参数总结:
1.-B指定多个库,增加建库语句和use
2.–compact 去掉注释
3.-A备份所有库
4.-F刷新binlog日志
5.–master-data增加binlog日志文件名以 及对应位置
6.-x,锁表(–lock-all-tables)
7.-l,缩表为只读(–lock-tables)
8.-d,只备份表结构
9.-t只备份数据
10.–single-transaction 适合innodb事务数据库备份。innodb表在备份时,通常启用–single-transaction来保证备份的一致性,实际上它的工作原理是设定本次回话的隔离级别为:REPEATABLE READ,以确保本次dump时,不会看到其他会话已经提交的数据。
不同引擎备份命令:
myisam:
mysqldump -uroot -p123456 -A -B --master-data=2 -x --events|gzip>/opt/all.sql.gz #myisam直接锁表,备份时不能读写
innodb:
mysqldump -uroot -p123456 -A -B --master-data=2 --single-transaction --events|gzip>/opt/all.sql.gz
–master-data=2 是把change log 那行注释掉,=1 是没有注释.
2.1利用备份恢复数据库
恢复命令:
mysql -uroot -p123456 data_default mysql -uroot -p123456
2.2.备份结合bin_log日志恢复数据库
详细解释请看Mysql数据库之Binlog日志使用总结这篇文章。
binlog日志存放在mysql安装目录下的/data目录下,用来记录mysql内部所有的增删改查等对mysql数据库内容有更新的操作纪律。
binlog日志包括两类文件
1)二进制日志索引文件(文件名后缀为.index)用于记录所有的二进制文件
2)二进制日志文件(文件名后缀为.00000*)记录数据库所有的DDL和DML(除了数据查询语句select)语句事件。
开启binlog日志功能
binglog日志什么状态下刷新(切割)
1)每当mysqld服务重启时
2)执行mysql> flush logs;命令时
3)在mysqldump备份数据时加 -F 选项也会刷新binlog日志;
vim /etc/my.cnf
在[mysqld] 区块添加
log-bin=mysql-bin 确认是关闭状态(mysql-bin 是日志的基本名或前缀名)
/etc/init.d/mysqld restart #重启mysqld生效
查看binlog日志方法两种:
1) 通过mysqlbinlog命令可以查看binlog的内容
# /home/application/mysql/bin/mysqlbinlog /home/application/mysql/data/mysql-bin.000001|more
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#190628 1:19:57 server id 1 end_log_pos 107 Start: binlog v 4, server v 5.5.62-log created 190628 1:19:57 at startup
# Warning: this binlog is either in use or was not closed properly.
ROLLBACK/*!*/;
BINLOG '
vfoUXQ8BAAAAZwAAAGsAAAABAAQANS41LjYyLWxvZwAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAC9+hRdEzgNAAgAEgAEBAQEEgAAVAAEGggAAAAICAgCAA==
'/*!*/;
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
解析binlog格式:
位置
位于文件中的位置,“at 4”说明“事件”的起点,是以第4字节开始;“end_log_pos 107”说明以第294字节结束
时间戳
事件发生的时间戳:“190628 1:19:57”
事件执行时间
事件执行花费的时间:“exec_time=28”
错误码
错误码为:“error_code=0”
服务器的标识
服务器的标识id:“server id 1”
2)在进入mysql数据库查看
命令格式:
mysql> show binlog events [IN ‘log_name’] [FROM pos] [LIMIT [offset,] row_count];
参数解释:
IN ‘log_name’ :指定要查询的binlog文件名(不指定就是第一个binlog文件)
FROM pos :指定从哪个pos起始点开始查起(不指定就是从整个文件首个pos点开始算)
LIMIT [offset,] :偏移量(不指定就是0)
row_count :查询总条数(不指定就是所有行)
查看binlog日志列表
show master logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 107 |
+------------------+-----------+
1 row in set (0.00 sec)
例如:
mysql> show binlog events in 'mysql-bin.000001'\G; #加上G以表显示
*************************** 1. row ***************************
Log_name: mysql-bin.000001
Pos: 4
Event_type: Format_desc
Server_id: 1
End_log_pos: 107
Info: Server ver: 5.5.62-log, Binlog ver: 4
1 row in set (0.00 sec)
ERROR:
No query specified
mysql> show binlog events in 'mysql-bin.000001'; #推荐
+------------------+-----+-------------+-----------+-------------+---------------- -----------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+------------------+-----+-------------+-----------+-------------+---------------------------------------+
| mysql-bin.000001 | 4 | Format_desc | 1 | 107 | Server ver: 5.5.62-log, Binlog ver: 4 |
+------------------+-----+-------------+-----------+-------------+---------------------------------------+
1 row in set (0.00 sec)
其他一些用法:
a)查询第一个(最早)的binlog日志:
mysql> show binlog events\G;
b)指定查询 mysql-bin.000002这个文件:
mysql> show binlog events in ‘mysql-bin.000002’\G;
c)指定查询 mysql-bin.000002这个文件,从pos点:624开始查起:
mysql> show binlog events in ‘mysql-bin.000002’ from 624\G;
d)指定查询 mysql-bin.000002这个文件,从pos点:624开始查起,查询10条(即10条语句)
mysql> show binlog events in ‘mysql-bin.000002’ from 624 limit 10\G;
e)指定查询 mysql-bin.000002这个文件,从pos点:624开始查起,偏移2行(即中间跳过2个),查询10条
mysql> show binlog events in ‘mysql-bin.000002’ from 624 limit 2,10\G;
恢复:
a)从binlog日志恢复数据方法
恢复命令的语法格式:
mysqlbinlog mysql-bin.0000xx | mysql -u用户名 -p密码 数据库名
常用参数选项解释:
–start-position=875 起始pos点
–stop-position=954 结束pos点
–start-datetime=“2018-9-25 22:01:08” 起始时间点
–stop-datetime=“2018-9-25 22:09:46” 结束时间点
–database=zyyshop 指定只恢复zyyshop数据库(一台主机上往往有多个数据库,只限本地log日志)
不常用选项:
-u --user=name 连接到远程主机的用户名
-p --password[=name] 连接到远程主机的密码
-h --host=name 从远程主机上获取binlog日志
–read-from-remote-server 从某个MySQL服务器上读取binlog日志
小结:实际是将读出的binlog日志内容,通过管道符传递给mysql命令。这些命令、文件尽量写成绝对路径;
首先恢复没问题数据
mysql -uroot -p123456 data_default 找到出问题语句,删除出问题语句然后恢复
mysqlbinlog --stop-position=108 --database=data_default /var/lib/mysql/mysql-bin.000001 | mysql -uroot -p123456 -v data_default
#指定恢复108以前的数据,并且指定data_default库
b)指定库恢复数据
因为binlog日志是记录所有对数据操作的语句,不分库记录。所有的操作都记录在一起。例如只想恢复某一个库的数据可以加-d( --database=)参数;
mysqlbinlog -d data_default mysql-bin.000005 |mysql -uroo -p123456
2.3 利用source命令恢复数据库
进入mysql数据库控制台,mysql -u root -p登录后。
mysql>use 数据库
然后使用source命令,参数为备份的文件*.sql.
mysql>source data_db.sql#这个文件是系统路径,默认是登录mysql前的系统路径。
例如:
mysql>system ls /opt #查看备份路径
mysql>source /opt/data_db.sql
show status:查看当前回话的数据库状态信息
show global status;查看整个数据库运行状态信息
show processlist;查看正在执行的sql语句,看不全
show full processlist;查看正在执行的完整sql语句,全
set global key_buffer_size =32552441;不重启数据库调整缓存大小,直接生效,重启失效
show variables;查看数据库的参数信息,例如:my.cnf里的参数。