mysql数据库备份的几种方法

mysql数据库备份的几种方法,第1张

数据备份数据容灾的最后一道防线,即便有着两地三中心的架构,备份也依然重要。如果备份出问题,备份时影响了交易业务,备份数据无法恢复,这些也是企业难以承受的。所以选择合适的备份工具尤为重要。

每个企业级数据库都会有配套的备份工具,MEB(MySQL Enterprise Backup)就是MySQL企业版中非常重要的工具之一,是为企业级客户提供的数据备份方案。

Xtrabackup一直作为MEB 开源版备胎而存在,从MySQL 80开始情况可能会变得有所不同。

在 MySQL 80的Backup Lock、Redo Log Archiving、Page Tracking等新特性的加持下,MEB备份/恢复体验会更好,目前xtrabackup还不支持这些特性。

MySQL 企业版还有哪些功能?

特性1:Backup Lock

80之前使用xtrabackup或MEB做物理备份,为了保证备份时InnoDB引擎表与其他引擎数据文件、及binlog日志的一致性会上全局读锁,再拷贝非InnoDB文件,这期间MySQL会变成只读,数据无法写入。表数量越多,可能加上时间越长,如果使用的xtrabackup 不小心没加rsync参数,逐个拷贝frm文件,锁定时间会更长,对业务影响较大。

我曾遇到过部署在虚拟机的实例有12000多张表,当时使用的xtrabackup,备份脚本中没加rsync参数,结果锁了十几分钟,而MEB就没有这样的问题。

MySQL 80支持轻量级备份锁 LOCK INSTANCE FOR BACKUP,数据字典也重构了由InnoDB存储。若不创建非InnoDB表,MEB默认使用备份锁获取binlog日志一致性位置,并阻止DDL *** 作,但不影响DML *** 作。

只有InnoDB表,仅上备份锁

若有非InnoDB表,上全局锁

特性2:Redo Log Archiving

MEB能做到在线热备,备份时不影响数据库读写,这是利用了InnoDB事务日志,在备份期间持续监视redo log的变化,读取增量变化,写入到ibbackup_logfile,也就不需要上锁来保障备份一致性。(对非InnoDB的文件需要上读锁拷贝)

如果备份期间数据库写入负载特别大,而写入ibbackup_logfile速度较慢,redo log size也不大,很可能会出现ibbackup_logfile的写入速度跟不上redo log记录生成速度,redo log 空间不够时需要覆写日志文件,那么来不及写入ibbackup_logfile的记录会丢失,导致备份失败。

MEB 41对此做了优化,将redo log处理线程拆分成多线程分工合作,提高处理redo log的效率,降低了redo log覆写造成备份失败的概率,但redo log新增速度和ibbackup_logfile写入速度悬殊太大,问题依然会发生。

MySQL 8017支持了redo log archiving 彻底解决了此问题,备份前设置innodb_redo_log_archive_dirs,指定redo log归档目录。MEB备份时自动开启日志归档,当checkpoint时会将旧记录归档到此目录,后续从归档文件中读取redo日志记录,避免了覆写可能导致的redo记录丢失。

注意:innodb_redo_log_archive_dirs 不能在数据目录下,目录权限要求是700

特性3:Page Tracking

Page Tracking 是为优化增量备份效率,减少不必要的数据页扫描。

增量备份当前有3种扫描模式:

page-track:利用LSN精确跟踪上次备份之后被修改页面,仅复制这些页面,效率最快。

optimistic:扫描上次备份之后被修改的InnoDB 数据文件中,找出并拷贝修改的页面。依赖系统时间,使用存在限制。

full-scan:扫描所有InnoDB数据文件,找出并拷贝自上次备份之后修改的页面,效率最慢

1、利用page-track增量备份,需先安装备份组件

mysql> INSTALL COMPONENT "file://component_mysqlbackup";

2、在全备前开启page-track

SELECT mysqlbackup_page_track_set(true);

3、全备之后,做增量备份时指定若满足page tracking条件,默认会使用page-track模式,否则会使用full-scan模式,也可以指定--incremental=page-track。

mysqlbackup --incremental-backup-dir=backup_incr --trace=3 --incremental=page-track --incremental-base=history:last_full_backup backup

incremental-base有3种选择

last_backup:基于前一次备份做增备,前一次备份可能是增备,也可能是全备。这种方式全备之间可能会有多个增备,每次增量可能比较小,但恢复时需要逐个合并。

last_full_backup:基于前一次全备做增备。这种方式增备会越往后体积可能越大,但恢复时只需要合并最后一次增量备份。

dir:基于前一次的备份目录,前一次备份可能是增备,也可能是全备。

测试对比full-scan 和page-track ,在变更页小于总体50%的情况下 ,备份效率至少能有1倍的速度提升。

page-track 模式 磁盘读写均衡,说明读写的都是修改页面。

full-scan模式 磁盘读写差别很大,说明读了很多未修改的页面。

使用直接拷贝的方法备份时,尤其要注意表没有被使用,应该对表进行读锁定或停止MySQL服务。备份一个表,需要三个文件:

对于MyISAM表:

tbl_namefrm 表的描述文件

tbl_nameMYD 表的数据文件

tbl_nameMYI 表的索引文件

对于ISAM表:

tbl_namefrm 表的描述文件

tbl_nameISD 表的数据文件

tbl_nameISM 表的索引文件

对于MyISAM表,你可以从运行在不同硬件系统的服务器之间复制文件,例如,SUN服务器和INTEL PC机之间。

当 然,这只是备份一个数据表,在很多情况下我们需要备份完整的数据库,这个时候同样可以直接复制数据库文件夹即可完成备份;若想再省点儿事,把整个数据库目 录“data”复制也可以,但是在还原数据时要注意,只能一个一个地还原数据库,因为该目录下有mysql运行时的配置文件,若正在运行的mysql配置 信息遭到还原破坏,整个mysql服务就会无法启动。

SELECT INTO OUTFILE和MYSQLDUMP备份数据:

MySQLdump工具可以把整个数据库装载到一个单独的文本文件中。这个文件包含所有重建数据库和表的SQL命令。这个命令取得所有的模式 (Schema)并且将其转换成DDL语法(CREATE语句,即数据库定义语句),还取得所有的数据,并且为这些数据创建INSERT语句。所有的东西 都被包含到了一个文本文件中。这个文本文件可以用一个简单的批处理和一个合适SQL语句导回到MySQL中。这个工具令人难以置信地简单而快速。

有3种方式来调用mysqldump

选择一个数据库或一个数据表备份到一个文件:

/bin> mysqldump [options] db_name [tables] > filenametxt

选择多个数据库备份到一个文件:

/bin> mysqldump [options] --database DB1 [DB2 DB3] > filenametxt

所有数据库备份到一个文件:

/bin> mysqldump [options] --all--database > filenametxt

Option选择:

--help,-?

显示帮助消息并退出。

--add-drop-table

这个选项将会在每一个表的前面加上DROP TABLE IF EXISTS语句,这样可以保证导回MySQL数据库的时候不会出错,因为每次导回的时候,都会首先检查表是否存在,存在就删除

--add-locks

这个选项会在INSERT语句中捆上一个LOCK TABLE和UNLOCK TABLE语句。这就防止在这些记录被再次导入数据库时其他用户对表进行的 *** 作

-c or --complete_insert

这个选项使得MySQLdump命令给每一个产生INSERT语句加上列(field)的名字。当把数据导出导另外一个数据库时这个选项很有用。

--delayed-insert 在INSERT命令中加入DELAY选项

-F or --flush-logs 使用这个选项,在执行导出之前将会刷新MySQL服务器的log

-f or --force 使用这个选项,即使有错误发生,仍然继续导出

--full 这个选项把附加信息也加到CREATE TABLE的语句中

-l or --lock-tables 使用这个选项,导出表的时候服务器将会给表加锁。

-t or --no-create- info

这个选项使的MySQLdump命令不创建CREATE TABLE语句,这个选项在您只需要数据而不需要DDL(数据库定义语句)时很方便。

-d or --no-data 这个选项使的MySQLdump命令不创建INSERT语句。

在您只需要DDL语句时,可以使用这个选项。

--opt 此选项将打开所有会提高文件导出速度和创造一个可以更快导入的文件的选项。

-q or --quick 这个选项使得MySQL不会把整个导出的内容读入内存再执行导出,而是在读到的时候就写入导文件中。

-T path or --tab = path

这 个选项将会将数据库中每一个表创建两个文件,一个文件包含DDL语句或者表创建语句,另一个文件包含数据。DDL文件被命名为 table_namesql,数据文件被命名为table_nametxt。该参数的path为存放目录,而且该目录必须已经存在。 如:/bin>mysqldump –uroot –p --tab=d:\\ mydata

-w "WHERE Clause" or --where = "Where clause " 筛选将要放到导出文件的数据。

下面来看几组mysqldump命令案例:

将数据库mydata的内容备份到mydatatxt文件中:

/bin>MySQLdump –uroot -p mydata > d:\\mydatatxt

将mydata数据库中的users表的内容备份到d:\\userstxt:

/bin>MySQLdump –uroot -p mydata users > d:\\userstxt

将mydata数据库中的users表username值为“feihu”的数据备份到d:\\userstxt:

/bin>MySQLdump –uroot -p --where=”username=’feihu’” mydata users > d:\\userstxt;

将mydata数据库以及内部表的创建结构(DDL)备份到d:\\userstxt:

/bin>MySQLdump –uroot –p -d mydata > d:\\mydatatxt

将mydata和mydata2数据库同时备份到d:\\userstxt:

/bin> MySQLdump –uroot –p -d mydata mydata2 > d:\\mydatatxt

将所有数据备份到一个数据库,命令怎么写呢???

schema: 模式The set of statements, expressed in data definition language, that completely describe the structure of a data base(一组以数据定义语言来表达的语句集,该语句集完整地描述了数据库的结构。)

当需要将还原备份数据时,使用如下语句:

/bin>mysql –uroot –p mydata < d:\\mydatatxt;

注意使用“<”符号,导入数据。还可以使用source命令执行文件中的脚本来还原数据,如:

Mysql>source d:\mydatatxt;

LOAD DATA INFILE和MYSQLIMPORT恢复数据

关于load data infile语句的使用已经在别一节讲述过了,详细请参考“使用LOAD DATA和INSERT语句导入Mysql数据”。如果你仅仅恢复数据, mysqlimport完全是与LOAD DATA 语句对应的,读者可以任意选择一个去实现。

MySQLimport位于MySQL/bin目录中,是MySQL的一个载入(或者说导入)数据的一个非常有效的工具。这是一个命令行工具。有两个参数 以及大量的选项可供选择。这个工具把一个文本文件(textfile)导入到你指定的数据库和表中。比方说我们要从文件userstxt中把数据导入到 数据库mydata中的表users中:

/bin>mysqlimport –uroot –p mydata d:\userstxt

注意:这里userstxt是我们要导入数据的文本文件,而mydata是我们要 *** 作的数据库,数据库中的表名是users,这里文本文件的数据格式必须与users表中的记录格式一致,否则MySQLimport命令将会出错。

其中表的名字是导入文件的第一个句号()前面文件字符串,另外一个例子:MySQLimport mydata users200910txt;那么我们将把文件中的内容导入到数据库mydata 中的users表中。

上面的例子中,都只用到两个参数,并没有用到更多的选项,下面介绍MySQLimport的选项

-d or --delete 新数据导入数据表中之前删除数据数据表中的所有信息

-f or --force 不管是否遇到错误,MySQLimport将强制继续插入数据

-i or --ignore MySQLimport跳过或者忽略那些有相同唯一关键字的行, 导入文件中的数据将被忽略。

-l or -lock-tables 数据被插入之前锁住表,这样就防止了,你在更新数据库时,用户的查询和更新受到影响。

-r or -replace 这个选项与-i选项的作用相反;此选项将替代表中有相同唯一关键字的记录。

--fields-enclosed-by= char 指定文本文件中数据的记录时以什么括起的, 很多情况下数据以双引号括起。 默认的情况下数据是没有被字符括起的。

--fields-terminated-by=char 指定各个数据的值之间的分隔符,在句号分隔的文件中,分隔符是句号。您可以用此选项指定数据之间的分隔符。默认的分隔符是跳格符(Tab)

--lines-terminated-by=str 此选项指定文本文件中行与行之间数据的分隔字符串或者字符。 默认的情况下MySQLimport以newline为行分隔符。您可以选择用一个字符串来替代一个单个的字符:一个新行或者一个回车。

MySQLimport命令常用的选项还有-v 显示版本(version),-p 提示输入密码(password)等。

如果,我们要导入一个文件(Orderstxt)中行的记录格式是这样的:

"1", "ORD89876", "1 Dozen Roses", "19991226"

我们的任务是要把这个文件里面的数据导入到数据库mydata中的表格Orders中,我们使用这个命令:

/Bin>MySQLimport -uroot–prl --fields-enclosed-by=" --fields-terminated-by=, mydata Orderstxt

比如我们要插入一些数据,使用包含下面文本的文件(文件名为New_Datasql,当然我们也可以取名为New_Datatxt及任何其他的合法名字,并不一定要以后缀sql结尾):

USE mydata; INSERT INTO Orders (Orders_ID, username) VALUES(1, "Block"); INSERT INTO Orders (Orders_ID, username) VALUES(2, "Newton"); INSERT INTO Orders (Orders_ID, username) VALUES(3, "Simmons");

注意上面的这些句子的语法都必须是正确的,并且每个句子以分号结束。上面的USE命令选择数据库,INSERT命令插入数据。

然后运行下面的命令:

/bin>mysql –uroot –p mydata < d:\New_Datatxt;

接着按提示输入密码,如果上面的文件中的语句没有错误,那么这些数据就被导入到了数据库中。

下载个navicat premium,网上有破解版的

新建数据库连接,输入你的mysql数据库连接的密码,自定义一个名称

双击打开该名称的连接,可以看到当前数据库连接下能够访问到的所有mysql数据库

打开数据库,可以看到数据库中的所有表,右键要备份的表,选择转储为sql文件,选择结构和数据一起转储就可以把数据表和数据一起备份成sql文件

需要使用时,只要右键数据库,选择运行sql文件,然后选中备份的sql文件运行,就可以还原原来备份的mysql数据库了

MySQL 支持的免费备份工具有:mysqldump、mysqlhotcopy1、mysqldump 11 备份 mysqldump 是采用SQL级别的备份机制,它将数据表导成 SQL 脚本文件,在不同的 MySQL 版本之间升级时相对比较合适,这也是最常用的备份方法。

楼主你好。

我用的是最简单最原始的方法。

在mysql的目录里面有一个文件夹,就是你建的数据库命名的,里面的文件就是你的表的描述文件,把那些表直接复制打包,等到你想用的时候解压覆盖就行了。

以上就是关于mysql数据库备份的几种方法全部的内容,包括:mysql数据库备份的几种方法、mysql 数据备份、如何备份MySQL数据库等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/10199178.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存