天天看点

mysql 备份表数据_MySQL备份数据库

最近,笔者因为一些原因,不得不手动在生产环境下操作数据库。在生产环境下操作数据非常危险,如果update更新或delete删除语句忘写了where条件或者写错了where条件,那么只能跑路了。为了保证万无一失,笔者在操作数据库前会进行数据备份,如此一来,即使手抖出错,数据也能及时从备份中恢复。笔者总结了mysql几种备份数据的方法。

1. 小表快速备份

这种方法最简单,也是笔者备份小表常用的方式。对需要备份的表加读锁,避免备份期间数据被修改,然后建立一张和原表一样结构的表,然后将原表数据复制到新表中,数据备份完成之后需要将将锁释放,命令如下所示

-- 对表加读锁

flush tables with read lock;

-- 创建备份表与原表数据结构一致

create table evt_tmp like evt;

-- 将原表数据拷入到新表中

insert into evt_tmp select * from evt;

-- 释放锁

unlock tables;

2. mysqldump

使用mysqldump命令,将数据导出成文件,文件中记录的是sql脚本数据,这种备份方式速度较慢,输出文件较大。笔者以test数据库为例,备份到test_bak数据库中

2.1 针对非事务引擎对数据库加读锁

flush tables with read lock使用mysqldump命令备份

mysqldump -u root -p --all-databases --master-data > backup_20191121.sql如果我们不想备份整个实例的所有数据库,

备份指定的数据库命令

mysqldump -u root -p --databases test --master-data > backup_20191121_test.sql

备份指定的表的命令

mysqldump -u root -p test tb1 --master-data > backup_20191121_tb1.sql然后我们需要根据备份文件恢复数据

mysql -hlocalhost -uroot -p test_bak < backup_20191121.sql

2.2 针对事务型数据库

mysqldum在备份事务型数据库时候,如果我们添加了—single-transaction参数,备份线程就不会阻塞任何读写连接,备份线程会标记一个时间点t,这种备份方式会生成两种文件,一种全量文件,另一种是增量文件,时间点之前的数据存放在全量文件中,时间点之后变动的数据存放在增量数据文件中,恢复数据时候,需要先恢复全量文件,再恢复增量文件。具体的命令执行过程如下

全量备份test数据库下tb1数据命令

mysqldump -u root -p –t test –tables tb1 --master-data –single-transaction > backup_20191010.sql

备份的数据文件有如下信息

CHANGE MASTER TO MASTER_LOG_FILE='master.000002', MASTER_LOG_POS=6632;

说明增量备份文件从master.000002开始

恢复数据如下两个步骤恢复时间点之前的全部数据

恢复时间点之后的增量备份更新

mysql -hlocalhost -uroot -p test_bak < backup_20191121.sql

mysqlbinlog master.000002 master.000003 | mysql

3. 复制文件的备份方式

除了上述备份方式,mysql针对myisam和innodb有专门的拷贝数据文件的备份方式。

3.1 MyIsam

针对MyIsam引擎备份数据非常简单,MyISAM数据文件独立于操作系统,可以轻松的从Windows服务器移植到Linux服务器

我们需要在复制数据文件前,需要加锁,保证在复制期间,数据不会被修改

--加锁

flush tables with read lock;

--加锁后执行数据文件拷贝命令

-- 完成复制文件后,将锁释放

unlock tables

3.2 Innodb

笔者以test数据库为例,将test数据库的数据备份到test_bak中首先我们导出test数据库的表结构,然后在test_bak中创建相同的库表结构

-- 导出我们需要的test数据库tb1表结构

mysqldump –d test –u root –p > structure.sql

-- 在test_bak库中执行structure.sql语句,创建数据表

use test_bak

source structure.sql

2. 在test_bak中执行如下命令,删除表空间

alter table tb1 discard tablespace

3. 在源数据库test中执行如下加锁命令,此时在数据库中会多出一个cfg文件

use test

flush table tb1 for export

4. 将test数据库目录中.ibd文件和cfg文件拷贝到test_bak数据库中

5. 释放test数据库的锁

unlock tables

6. 在test_bak中导入相应的表空间,备份完成

alter table tb1 import tablespace

执行最后一步的时候可能会出现如下错误,原因是复制的.ibd文件权限不足,赋权即可

Tablespace is missing for table