实现MySQL数据库的备份与还原的几种方法

实现MySQL数据库的备份与还原的几种方法,第1张

MyISAM 表是保存成文件的形式,因此相对比较容易备份,上面提到的几种方法都可以使用。Innodb 所有的表都保存在同一个数据文件 ibdata1 中(也可能是多个文件,或者是独立的表空间文件),相对来说比较不好备份,免费的方案可以是拷贝数据文件、备份 binlog,或者用 mysqldump。1 使用直接拷贝数据库备份 典型的如cp、tar或cpio实用程序当你使用直接备份方法时,必须保证表不在被使用。如果服务器在你正在拷贝一个表时改变它,拷贝就失去意义。保证你的拷贝完整性的最好方法是关闭服务器,拷贝文件,然后重启服务器。 如果你不想关闭服务器,要在执行表检查的同时锁定服务器。如果服务器在运行,相同的制约也适用于拷贝文件,应该使用相同的锁定协议让服务器“安静下来”。当你完成了MySQL数据库备份时,需要重启服务器(如果关闭了它)或释放加在表上的锁定(如果你让服务器运行)。 要用直接拷贝文件把一个数据库从一台机器拷贝到另一台机器上,只是将文件拷贝到另一台服务器主机的适当数据目录下即可。要确保文件是MyIASM格式或两台机器有相同的硬件结构,否则你的数据库在另一台主机上有奇怪的内容。你也应该保证在另一台机器上的服务器在你正在安装数据库表时不访问它们。2 使用mysqldump数据库备份mysqldump 是采用SQL级别的备份机制,它将数据表导成 SQL 脚本文件,在不同的 MySQL 版本之间升级时相对比较合适,这也是最常用的备份方法。mysqldump程序备份数据库较慢,但它生成的文本文件便于移植。mysqldump 的一些主要参数:1)--compatible=name它告诉 mysqldump,导出的数据将和哪种数据库或哪个旧版本的 MySQL 服务器相兼容。值可以为 ansi、mysql323、mysql40、postgresql、oracle、mssql、db2、maxdb、no_key_options、no_tables_options、no_field_options 等,要使用几个值,用逗号将它们隔开。当然了,它并不保证能完全兼容,而是尽量兼容。2)--complete-insert,-c导出的数据采用包含字段名的完整 INSERT 方式,也就是把所有的值都写在一行。这么做能提高插入效率,但是可能会受到 max_allowed_packet 参数的影响而导致插入失败。因此,需要谨慎使用该参数,至少我不推荐。3)--default-character-set=charset指定导出数据时采用何种字符集,如果数据表不是采用默认的 latin1 字符集的话,那么导出时必须指定该选项,否则再次导入数据后将产生乱码问题。4)--disable-keys告诉mysqldump 在 INSERT 语句的开头和结尾增加 ; 和 ; 语句,这能大大提高插入语句的速度,因为它是在插入完所有数据后才重建索引的。该选项只适合 MyISAM 表。5)--extended-insert = true|false默认情况下,mysqldump 开启 --complete-insert 模式,因此不想用它的的话,就使用本选项,设定它的值为 false 即可。6)--hex-blob使用十六进制格式导出二进制字符串字段。如果有二进制数据就必须使用本选项。影响到的字段类型有 BINARY、VARBINARY、BLOB。7)--lock-all-tables,-x在开始导出之前,提交请求锁定所有数据库中的所有表,以保证数据的一致性。这是一个全局读锁,并且自动关闭 --single-transaction 和 --lock-tables 选项。8)--lock-tables它和--lock-all-tables 类似,不过是锁定当前导出的数据表,而不是一下子锁定全部库下的表。本选项只适用于 MyISAM 表,如果是 Innodb 表可以用 --single-transaction 选项。9)--no-create-info,-t只导出数据,而不添加 CREATE TABLE 语句。10)--no-data,-d不导出任何数据,只导出数据库表结构。11)--opt这只是一个快捷选项,等同于同时添加 --add-drop-tables --add-locking --create-option --disable-keys --extended-insert --lock-tables --quick --set-charset 选项。本选项能让 mysqldump 很快的导出数据,并且导出的数据能很快导回。该选项默认开启,但可以用 --skip-opt 禁用。注意,如果运行 mysqldump 没有指定 --quick 或 --opt 选项,则会将整个结果集放在内存中。如果导出大数据库的话可能会出现问题。12)--quick,-q该选项在导出大表时很有用,它强制 mysqldump 从服务器查询取得记录直接输出而不是取得所有记录后将它们缓存到内存中。13)--routines,-R导出存储过程以及自定义函数。14)--single-transaction该选项在导出数据之前提交一个 BEGIN SQL语句,BEGIN 不会阻塞任何应用程序且能保证导出时数据库的一致性状态。它只适用于事务表,例如 InnoDB 和 BDB。本选项和 --lock-tables 选项是互斥的,因为 LOCK TABLES 会使任何挂起的事务隐含提交。要想导出大表的话,应结合使用 --quick 选项。--triggers同时导出触发器。该选项默认启用,用 --skip-triggers 禁用它。备份:使用mysqldump备份数据库其实就是把数据库转储成一系列CREATE TABLE和INSERT语句,通过这些语句我们就可重新生成数据库。使用mysqldump的方法如下:% mysqldump --opt testdb | gzip > /data/backup/testdbbak#--opt选项会对转储过程进行优化,生成的备份文件会小一点,后的管道 *** 作会进行数据压缩% mysqldump --opt testdb mytable1,mytable2 | gzip > /data/backup/testdb_mytablebak#可在数据库后接数据表名,只导出指定的数据表,多个数据表可用逗号分隔--opt选项还可激活--add-drop-table选项,它将会在备份文件的每条CREATE TABLE前加上一条DROP TABLE IF EXISTS语句。这可方便进行数据表的更新,而不会发生“数据表已存在”的错误。用mysqldump命令还可直接把数据库转移到另外一台服务器上,不用生成备份文件。重复执行可定期更新远程数据库。% mysqladmin -h remote_host create testdb% mysqldump --opt testdb | mysql -h remote_host testdb另外还可通过ssh远程调用服务器上的程序,如:% ssh remote_host mysqladmin create testdb% mysqldump --opt testdb | ssh remote_host mysql testdb 通过直接拷贝系统文件的方式备份数据库,在备份时,要确保没有人对数据库进行修改 *** 作。要做到这点,最好关闭服务器。如果不能关闭的,要以只读方试锁定有关数据表。下面是一些示例:% cp -r db /backup/db #备份db数据库到/backup/db目录% cp table_name /backup/db #只备份table_name数据表% scp -r db remotehot:/usr/local/mysql/data #用scp把数据库直接拷贝到远程服务器,在把数据库直接拷贝到远程主机时,应注意两台机器必须有同样的硬件结构,或者将拷贝的数据表全部是可移植数据表类型。或者/usr/local/mysql/bin/mysqldump -uroot -proot \--default-character-set=utf8 --opt --extended-insert=false \--triggers -R --hex-blob -x testdb > testdbsql使用以下 SQL 来备份 Innodb 表:/usr/local/mysql/bin/mysqldump -uroot -proot \--default-character-set=utf8 --opt --extended-insert=false \--triggers -R --hex-blob --single-transaction testdb > testdbsql另外,如果想要实现在线备份,还可以使用 --master-data 参数来实现,如下:/usr/local/mysql/bin/mysqldump -uroot -proot \--default-character-set=utf8 --opt --master-data=1 \--single-transaction --flush-logs testdb > testdbsql它只是在一开始的瞬间请求锁表,然后就刷新binlog了,而后在导出的文件中加入CHANGE MASTER 语句来指定当前备份的binlog位置,如果要把这个文件恢复到slave里去,就可以采用这种方法来做。 还原:用mysqldump 备份出来的文件是一个可以直接倒入的 SQL 脚本,有两种方法可以将数据导入。直接用 mysql 客户端例如:/usr/local/mysql/bin/mysql -uroot -proot testdb < testdbsql用SOURCE 语法其实这不是标准的 SQL 语法,而是 mysql 客户端提供的功能,例如:SOURCE /tmp/testdbsql;这里需要指定文件的绝对路径,并且必须是 mysqld 运行用户(例如 nobody)有权限读取的文件。 3 使用mysqlhotcopy数据库备份 使用mysqlhotcopy工具,它是一个Perl DBI脚本,可在不关闭服务器的情况下备份数据库,mysqlhotcopy 是一个 PERL 程序,最初由Tim Bunce编写。它使用 LOCK TABLES、FLUSH TABLES 和 cp 或 scp 来快速备份数据库。它是备份数据库或单个表的最快的途径,但它只能运行在数据库文件(包括数据表定义文件、数据文件、索引文件)所在的机器上。mysqlhotcopy 只能用于备份 MyISAM,并且只能运行在 类Unix 和 NetWare 系统上。它主要的优点是:它直接拷贝文件,所以它比mysqldump快。可自动完成数据锁定工作,备份时不用关闭服务器。能刷新日志,使备份文件和日志文件的检查点能保持同步。备份:mysqlhotcopy 支持一次性拷贝多个数据库,同时还支持正则表达。以下是几个例子:/usr/local/mysql/bin/mysqlhotcopy -h=localhost -u=root -p=root \testdb /tmp (把数据库目录 testdb 拷贝到 /tmp 下)/usr/local/mysql/bin/mysqlhotcopy -h=localhost -u=root -p=root \testdb_1 testdb_2 testdb_n /tmp/usr/local/mysql/bin/mysqlhotcopy -h=localhost -u=root -p=root \testdb/regex/ /tmp 还原:mysqlhotcopy 备份出来的是整个数据库目录,使用时可以直接拷贝到 mysqld 指定的 datadir (在这里是 /usr/local/mysql/data/)目录下即可,同时要注意权限的问题,如下例:cp -rf testdb /usr/local/mysql/data/chown -R nobody:nobody /usr/local/mysql/data/ (将 testdb 目录的属主改成 mysqld 运行用户) 4 使用SQL语句数据库备份 BACKUP TABLE 语法其实和 mysqlhotcopy 的工作原理差不多,都是锁表,然后拷贝数据文件。它能实现在线备份,但是效果不理想,因此不推荐使用。它只拷贝表结构文件和数据文件,不同时拷贝索引文件,因此恢复时比较慢。备份:BACK TABLE tbl_test TO '/tmp/testdb/'; #把tbl_test数据库备份到/tmp/testdb/目录里,会自动创建一个testdb目录 为了执行该语句,你必须拥有那些表的FILE权限和SELECT权限,备份目录还必须是服务器可写的。该语句执行时,会先把内存中的数据写入磁盘,再把各个数据表的frm(表结构定义文件)、MYD(数据)文件从数据目录拷贝到备份目录。它不拷贝MYI(索引)文件,因为它能用另外两个文件重建。BACKUP TABLE语句备份时,依次锁定数据表,当同时备份多个数据表时,数据表可能会被修改,所以备份0完成时,备份文件中的数据和现时数据表中的数据可能会有差异,为了消除该差异,我们可用只读方式锁定数据表,在备份完成后再解锁。如:mysql> LOCK TABLES tb1 READ,tb2 READ;mysql> BACKUP TABLE tb1,tb2 TO 'backup/db';mysql> UNLOCK TABLES;使用BACKUP TABLE语句备份的数据表可用RESTORE TABLE重新加载到服务器。注意,必须要有 FILE 权限才能执行本SQL,并且目录 /tmp/testdb/ 必须能被 mysqld 用户可写,导出的文件不能覆盖已经存在的文件,以避免安全问题。SELECT INTO OUTFILE 则是把数据导出来成为普通的文本文件,可以自定义字段间隔的方式,方便处理这些数据。例子:SELECT INTO OUTFILE '/tmp/testdb/tbl_testtxt' FROM tbl_test;注意,必须要有 FILE 权限才能执行本SQL,并且文件 /tmp/testdb/tbl_testtxt 必须能被 mysqld 用户可写,导出的文件不能覆盖已经存在的文件,以避免安全问题。还原:用BACKUP TABLE 方法备份出来的文件,可以运行 RESTORE TABLE 语句来恢复数据表。例子:RESTORE TABLE FROM '/tmp/testdb/';权限要求类似上面所述。用SELECT INTO OUTFILE 方法备份出来的文件,可以运行 LOAD DATA INFILE 语句来恢复数据表。例子:LOAD DATA INFILE '/tmp/testdb/tbl_nametxt' INTO TABLE tbl_name;权限要求类似上面所述。倒入数据之前,数据表要已经存在才行。

Oracle 9i比8i多了哪些新特性?

简要说:

9i更易于管理。

详细说:

并发集群,8i OPS升级为9i RAC,8i结点间用硬盘交换信息,9i结点间采用高速网线的缓存熔合(Cache Fusion)技术交换信息,交换速度提高100倍以上。

9i可以在线修改内核参数和内存分配,8i不行。

数据文件和表空间管理,8i手工管理,9i自动管理。

9i比8i增强了对ANSI SQL99的支持。

9i比8i增强了故障后的快速恢复(Fast-start)。

8i只支持物理备份(physical backup)数据库,9i还增加了支持逻辑备份(logical backup)数据库,使备份数据库除了作为主数据库的镜像外,还可以提供其他数据服务

Oracle 10g比9i多了哪些新特性?

简要说:

10g支持网格(Grid),支持自动管理(Automatic Management)。

详细说:

10g的g是"Grid"缩写,支持网格计算,即,多台结点服务器利用高速网络组成一个虚拟的高性能服务器,负载在整个网格中均衡(Load Balance),按需增删结点,避免单点故障(Single Point of Faliure)。

安装容易,安装工作量比9i减少了一半。

新增基于浏览器的企业管理器(Enterprise Manager)。

自动存储管理(ASM),增删硬盘不再需要 *** 作系统管理员设置的镜像、负载均衡、物理卷、逻辑卷、分区、文件系统,只要打一条Oracle命令,ASM会自动管理增加或删除的硬盘。

内存自动化,根据需要自动分配和释放系统内存。

SQL性能调整自动化。

免费提供基于浏览器的小应用开发工具Oracle Application Express(原名HTML DB),支持10g和9i R2。

快速纠正人为错误的闪回(Flashback)查询和恢复,可以恢复数据库、表甚至记录。

数据泵(Data Pump)高速导入、导出数据,比传统方法导出速度快两倍以上,导入速度快15--45倍。

精细审计(Fine-Grained Auditing),记录一切对敏感数据的 *** 作。

存储数据的表空间(Tablespace)跨平台复制,极大的提高数据仓库加载速度。

流(Streams)复制,实现低系统消耗、双向(double-direction)、断点续传(resume from break point)、跨平台(cross platform)、跨数据源的复杂复制。

容灾的数据卫士(Data Guard)增加了逻辑备份功能,备份数据库日常可以运行于只读状态,充分利用备份数据库。

支持许多新EE选件,加强数据库内部管理的“Database Vault”,数据库活动的审计的(Audit Vault),数据仓库构建高级功能(Warehouse Builder Enterprise ETL, Warehouse Builder Data Quality)

Oracle 11g比10g多了哪些新特性?

11 g 扩展了 Oracle 独家具有的提供网格计算优势的功能,您可以利用它来提高用户服务水平、减少停机时间以及更加有效地利用 IT资源,同时还可以增强全天候业务应用程序的性能、可伸缩性和安全性。

利用真正应用测试(RAT)尽量降低更改的风险

11 g降低了数据库升级以及其他硬件和 *** 作系统更改的成本,显著简化了更改前后的系统测试以便您可以识别和解决问题。例如:

利用 Database Replay,您可以在数据库级别轻松捕获实际的生产负载并在您的测试系统上重新播放,这样您可以全面测试系统更改(包括关键的并发特性)的影响。

SQL Performance Analyzer识别结构化查询语言 ) SQL(执行计划更改和性能回退。然后,可以使用 SQL Tuning Advisor解决识别的问题,方法是还原到原始的执行计划或进一步优化。

利用管理自动化提高 DBA 效率

Oracle 数据库 11 g继续致力于(从 Oracle9i数据库开始一直到 Oracle 数据库10 g)显著简化和完全自动化 DBA 任务。 Oracle数据库11 g中的新功能包括:

利用自学功能自动进行 SQL 优化系统全局区(SGA)和程序全局区( PGA)的内存缓存区的自动、统一调整新的 advisor用于分区、数据恢复、流性能和空间管理针对自动数据库诊断监视器 (ADDM)的增强,能够提供 Oracle 真正应用集群 (Oracle RAC)环境中的更好的性能全局视图以及改进的性能比较分析功能。

利用故障诊断快速解决问题

Oracle 数据库 11 g中新增的故障诊断功能使客户在发生错误后捕获 Oracle

Support所需的数据变得极为简单。这可以加速问题的解决,减少客户重现问题的需要。

尽量降低停机成本

通过 Oracle Data Guard快速恢复数据

Oracle Data Guard在本地和远程服务器之间协调数据库的维护和同步以便从灾难或站点故障快速恢复。 Oracle数据库11 g提供了大量显著的 Oracle Data Guard增强,包括

可以在物理备用系统上运行实时查询用于报表和其他目的

可以通过将物理备用系统暂时转换为逻辑备用系统执行联机的、滚动的数据库升级

支持测试环境的快照备用系统

此外,物理和逻辑备用的性能都有提高。逻辑备用现在支持可扩展标记语言(XML)类型字符大型对象 (CLOB)数据类型和透明的数据加密。现在支持自动的、快速启动的故障切换以支持异步传输。

Oracle 数据库 11 g提供了几个针对自动存储管理的重要的高可用性增强,

包括:

支持滚动升级

自动坏块检测和修复

快速镜像重新同步,该功能可以有效地重新同步存储网络连接性暂时丢失时自动存储管理镜像的存储阵列

自动存储管理的性能增强使得大型数据库可以更快地打开并减少 SGA 内存消耗。这些增强还允许 DBA增加存储分配单元大小以加快大型序列输入/输出 (I/O)

显著增加正常运行时间

Oracle数据库11 g使您可以应用很多一次性数据库补丁(包括诊断补丁),而没有停机时间。新的数据恢复 advisor通过快速识别故障根本原因、为 DBA提供可用的恢复选项,极大地减少了停机时间,在某些情况下,还通过“自我恢复”机制自动纠正问题。

Oracle 数据库 11 g还有其他高性能提高,包括

自动编译数据库中的 PL/SQL 和 Java

更快的触发器,包括更加有效地调用每行触发器

更快的简单 SQL *** 作

更快的 Oracle Data Guard 和 Oracle Streams 复制

与网络文件系统( NFS) 存储设备更快、更可靠的直接连接

更快的升级

大型文件更快的备份/还原

更快的备份压缩

Oracle 数据库 11 g包括大量新的 ILM特性,例如

新的分区功能,包括

按父/子引用分区

按虚拟列分区

Oracle数据库11 g还具有带 Oracle闪回数据归档的 Total Recall,使您可以在选定的表中查询以前的数据,从而提供了一种简单实用的向数据中添加时间维度的方法以便于更改跟踪、 ILM、审计和合规。

其他高可用性增强

Oracle 数据库 11g还有其他高可用性增强,包括:

Oracle闪回事务查询,提供带其他相关事务更改的流氓事务的按钮更改

具有更多可传输选项的增强的平台移植和数据移动,包括可传输分区、

模式和跨平台数据库

Oracle恢复管理器 (RMAN)支持 Windows Volume Shadow Copy

Service ( VSS )快照,从而实现与 Windows备份更紧密的集成

优化性能和可靠性

合规、法律取证以及整合数据仓库的趋势导致数据库的大小每两年就会增加

两倍,这极大地影响了大型数据库的存储成本和性能、可靠性以及可管理性

。Oracle 数据库 11 g使组织可以使用低成本的服务器和模块化的存储器轻

松伸缩大型的事务和数据仓库系统并提供快速的全天候数据访问。 Oracle 数

据库11 g提供新的创新特性以进一步提高要求极严格的环境的性能和可伸

缩性。

利用 SecureFiles安全地存储您的所有数据

SecureFiles 是 Oracle用于在数据库中存储大型对象) LOB (

(例如图像、大型文本对象或包括 XML、医学成像以及地理空间栅格对象在内的高级数据类型)的下一代产品。 SecureFiles提供能够完全与文件系统相媲美的卓越性能。此外,它还提供高级功能,例如智能压缩、透明加密以及透明的重复

删除。

通过联机事务处理压缩提高性能并尽量降低存储成本

Oracle 数据库 11 g支持联机事务处理 (OLAP)应用程序中常用的更新、

插入和删除 *** 作的数据压缩。以前的 Oracle数据库版本支持数据仓库应用

程序常用的批量数据加载 *** 作的压缩。 Oracle 数据库 11 g OLTP表压缩通

过更加高效地使用内存来缓存数据以及减少表扫描的 I/O提高了数据库性能

。利用 OLTP表压缩,您可以利用最小的处理开销达到 2 到 3倍的压缩

比。

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

现在来讲一下 mysqldump 的一些主要参数:--compatible=name 它告诉 mysqldump,导出的数据将和哪种数据库或哪个旧版本的 MySQL 服务器相兼容。值可以为 ansi、mysql323、mysql40、postgresql、oracle、mssql、db2、maxdb、no_key_options、no_tables_options、no_field_options 等,要使用几个值,用逗号将它们隔开。当然了,它并不保证能完全兼容,而是尽量兼容。--complete-insert,-c 导出的数据采用包含字段名的完整 INSERT 方式,也就是把所有的值都写在一行。这么做能提高插入效率,但是可能会受到 max_allowed_packet 参数的影响而导致插入失败。因此,需要谨慎使用该参数,至少我不推荐。--default-character-set=charset 指定导出数据时采用何种字符集,如果数据表不是采用默认的 latin1 字符集的话,那么导出时必须指定该选项,否则再次导入数据后将产生乱码问题。--disable-keys 告诉 mysqldump 在 INSERT 语句的开头和结尾增加 /!40000 ALTER TABLE table DISABLE KEYS /; 和 /!40000 ALTER TABLE table ENABLE KEYS /; 语句,这能大大提高插入语句的速度,因为它是在插入完所有数据后才重建索引的。该选项只适合 MyISAM 表。--extended-insert = true|false 默认情况下,mysqldump 开启 --complete-insert 模式,因此不想用它的的话,就使用本选项,设定它的值为 false 即可。--hex-blob 使用十六进制格式导出二进制字符串字段。如果有二进制数据就必须使用本选项。影响到的字段类型有 BINARY、VARBINARY、BLOB。--lock-all-tables,-x 在开始导出之前,提交请求锁定所有数据库中的所有表,以保证数据的一致性。这是一个全局读锁,并且自动关闭 --single-transaction 和 --lock-tables 选项。--lock-tables 它和 --lock-all-tables 类似,不过是锁定当前导出的数据表,而不是一下子锁定全部库下的表。本选项只适用于 MyISAM 表,如果是 Innodb 表可以用 --single-transaction 选项。--no-create-info,-t 只导出数据,而不添加 CREATE TABLE 语句。--no-data,-d 不导出任何数据,只导出数据库表结构。--opt 这只是一个快捷选项,等同于同时添加 --add-drop-tables --add-locking --create-option --disable-keys --extended-insert --lock-tables --quick --set-charset 选项。本选项能让 mysqldump 很快的导出数据,并且导出的数据能很快导回。该选项默认开启,但可以用 --skip-opt 禁用。注意,如果运行 mysqldump 没有指定 --quick 或 --opt 选项,则会将整个结果集放在内存中。如果导出大数据库的话可能会出现问题。--quick,-q 该选项在导出大表时很有用,它强制 mysqldump 从服务器查询取得记录直接输出而不是取得所有记录后将它们缓存到内存中。--routines,-R 导出存储过程以及自定义函数。--single-transaction 该选项在导出数据之前提交一个 BEGIN SQL语句,BEGIN 不会阻塞任何应用程序且能保证导出时数据库的一致性状态。它只适用于事务表,例如 InnoDB 和 BDB。

本选项和 --lock-tables 选项是互斥的,因为 LOCK TABLES 会使任何挂起的事务隐含提交。

要想导出大表的话,应结合使用 --quick 选项。--triggers 同时导出触发器。该选项默认启用,用 --skip-triggers 禁用它。其他参数详情请参考手册,我通常使用以下 SQL 来备份 MyISAM 表:/usr/local/mysql/bin/mysqldump -uyejr -pyejr \--default-character-set=utf8 --opt --extended-insert=false \--triggers -R --hex-blob -x db_name > db_namesql 使用以下 SQL 来备份 Innodb 表:/usr/local/mysql/bin/mysqldump -uyejr -pyejr \--default-character-set=utf8 --opt --extended-insert=false \--triggers -R --hex-blob --single-transaction db_name > db_namesql 另外,如果想要实现在线备份,还可以使用 --master-data 参数来实现,如下:/usr/local/mysql/bin/mysqldump -uyejr -pyejr \--default-character-set=utf8 --opt --master-data=1 \--single-transaction --flush-logs db_name > db_namesql 它只是在一开始的瞬间请求锁表,然后就刷新binlog了,而后在导出的文件中加入CHANGE MASTER 语句来指定当前备份的binlog位置,如果要把这个文件恢复到slave里去,就可以采用这种方法来做。12 还原 用 mysqldump 备份出来的文件是一个可以直接倒入的 SQL 脚本,有两种方法可以将数据导入。直接用 mysql 客户端 例如:/usr/local/mysql/bin/mysql -uyejr -pyejr db_name < db_namesql 用 SOURCE 语法 其实这不是标准的 SQL 语法,而是 mysql 客户端提供的功能,例如:SOURCE /tmp/db_namesql; 这里需要指定文件的绝对路径,并且必须是 mysqld 运行用户(例如 nobody)有权限读取的文件。2、 mysqlhotcopy 21 备份 mysqlhotcopy 是一个 PERL 程序,最初由Tim Bunce编写。它使用 LOCK TABLES、FLUSH TABLES 和 cp 或 scp 来快速备份数据库。它是备份数据库或单个表的最快的途径,但它只能运行在数据库文件(包括数据表定义文件、数据文件、索引文件)所在的机器上。mysqlhotcopy 只能用于备份 MyISAM,并且只能运行在 类Unix 和 NetWare 系统上。mysqlhotcopy 支持一次性拷贝多个数据库,同时还支持正则表达。以下是几个例子:root#/usr/local/mysql/bin/mysqlhotcopy -h=localhost -u=yejr -p=yejr \db_name /tmp (把数据库目录 db_name 拷贝到 /tmp 下)root#/usr/local/mysql/bin/mysqlhotcopy -h=localhost -u=yejr -p=yejr \db_name_1 db_name_n /tmproot#/usr/local/mysql/bin/mysqlhotcopy -h=localhost -u=yejr -p=yejr \db_name/regex/ /tmp 更详细的使用方法请查看手册,或者调用下面的命令来查看 mysqlhotcopy 的帮助:perldoc /usr/local/mysql/bin/mysqlhotcopy 注意,想要使用 mysqlhotcopy,必须要有 SELECT、RELOAD(要执行 FLUSH TABLES) 权限,并且还必须要能够有读取 datadir/db_name 目录的权限。22 还原 mysqlhotcopy 备份出来的是整个数据库目录,使用时可以直接拷贝到 mysqld 指定的 datadir (在这里是 /usr/local/mysql/data/)目录下即可,同时要注意权限的问题,如下例:root#cp -rf db_name /usr/local/mysql/data/root#chown -R nobody:nobody /usr/local/mysql/data/ (将 db_name 目录的属主改成 mysqld 运行用户)

将线上db,导出后,导入到office db

两种方案:

1,将数据直接从online-->office,通过mysqldump

通过本地putty等和ecs建隧道,然后传数据到本地(本地win可以按照gzip,压缩后传到office server)

2,先在ecs上mysqldump压缩,然后下载下来

下载方案:

1,rsync daemon

2,rsync ssh

3,scp

4,sz <----这种速度较快,前三者都差不多,记得md5sum

比如想将一个1000W数据的数据库表,导出到文件;此时,你要么进行分页,oracle当然用三层包装即可,mysql用limit,不过分页每次都会新的查询,而且随着翻页,会越来越慢,其实我们想拿到一个句柄,然后向下游动,编译一部分数据(如10000行)将写文件一次(写文件细节不多说了,这个是最基本的),需要注意的时候每次buffer的数据,在用outputstream写入的时候,最好flush一下,将缓冲区清空下;接下来,执行一个没有where条件的SQL,会不会将内存撑爆?是的,这个问题我们值得去思考下,通过API发现可以对SQL进行一些 *** 作,例如,通过:PreparedStatement statement = connectionprepareStatement(sql),这是默认得到的预编译,还可以通过设置:PreparedStatement statement = connectionprepareStatement(sql , ResultSetTYPE_FORWARD_ONLY , ResultSetCONCUR_READ_ONLY);

来设置游标的方式,以至于游标不是将数据直接cache到本地内存,然后通过设置statementsetFetchSize(200);设置游标每次遍历的大小;OK,这个其实我用过,oracle用了和没用没区别,因为oracle的jdbc API默认就是不会将数据cache到java的内存中的,而mysql里头设置根本无效,我上面说了一堆废话,呵呵,我只是想说,java提供的标准API也未必有效,很多时候要看厂商的实现机制,还有这个设置是很多网上说有效的,但是这纯属抄袭;对于oracle上面说了不用关心,他本身就不是cache到内存,所以java内存不会导致什么问题,如果是mysql,首先必须使用5以上的版本,然后在连接参数上加上useCursorFetch=true这个参数,至于游标大小可以通过连接参数上加上:defaultFetchSize=1000来设置,例如:

jdbc:mysql://xxxxxxxxxxxx:3306/abczeroDateTimeBehavior=convertToNull&useCursorFetch=true&defaultFetchSize=1000

上次被这个问题纠结了很久(mysql的数据老导致程序内存膨胀,并行2个直接系统就宕了),还去看了很多源码才发现奇迹竟然在这里,最后经过mysql文档的确认,然后进行测试,并行多个,而且数据量都是500W以上的,都不会导致内存膨胀,GC一切正常,这个问题终于完结了。

以上就是关于实现MySQL数据库的备份与还原的几种方法全部的内容,包括:实现MySQL数据库的备份与还原的几种方法、oracle 9i和oracle10i 有什么区别、mysql数据库不停库的情况下怎么备份并且做异地恢复等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/sjk/10100303.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存