MySql数据库的备份和恢复问题,大虾们帮忙。

xq498475373 2011-09-30 09:15:45
我有一个MySql数据库里面有一些表,也有数据,但是不知道表结构,我想把这些数据备份导出来。
现在新建了一个数据库,但是结构跟原来的相比较有变化,我想把原来的数据导进去,要怎么做才可以保证原来的数据不会丢失。大侠们帮帮忙。最好有详细的步骤和代码。谢谢谢谢谢谢!
...全文
75 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zuoxingyu 2011-10-06
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 xq498475373 的回复:]
现在的问题就是人家不让知道结构 只能让原来的数据库中的数据到新的数据库中去。
[/Quote]

不知道结构,那怎么样去一一对应的导库啊?
天知道。
ACMAIN_CHM 2011-09-30
  • 打赏
  • 举报
回复
如果结构有变化,则你需要另外创建一个新的数据库,将原来的备份导入,这样就有一个旧的数据库结构及数据。再通过自己的INSERT语句将旧数据插入,更新到新结构的库中。
ACMAIN_CHM 2011-09-30
  • 打赏
  • 举报
回复
参考MYSQL手册中下面内容。

[Quote]5.9. 备份与恢复
5.9.1. 数据库备份
5.9.2. 示例用备份与恢复策略
5.9.3. 自动恢复
5.9.4. 表维护和崩溃恢复
5.9.5. myisamchk:MyISAM表维护实用工具
5.9.6. 建立表维护计划
5.9.7. 获取关于表的信息
本节讨论如何进行数据库备份(完全备份和增量备份),以及如何执行表的维护。本节描述的SQL语句语法参见第5章:数据库管理。此处提供的大多数信息主要适合MyISAM表。InnoDB备份程序参见15.2.8节,“InnoDB数据库的备份和恢复”。

5.9.1. 数据库备份
因为MySQL表保存为文件方式,很容易备份。要想保持备份的一致性,对相关表执行LOCK TABLES操作,然后对表执行FLUSH TABLES。参见13.4.5节,“LOCK TABLES和UNLOCK TABLES语法”和13.5.5.2节,“FLUSH语法”。你只需要读锁定;这样当你复制数据库目录中的文件时,允许其它客户继续查询表。需要FLUSH TABLES语句来确保开始备份前将所有激活的索引页写入硬盘。

如果你想要进行SQL级别的表备份,你可以使用SELECT INTO ...OUTFILE或BACKUP TABLE。对于SELECT INTO ...OUTFILE, 输出的文件不能先存在。对于BACKUP TABLE也如此,因为覆盖完整的文件会有安全风险。参见13.2.7节,“SELECT语法”和13.5.2.2节,“BACKUP TABLE语法”。

备份数据库的另一个技术是使用mysqldump程序或mysqlhotcopy脚本。参见8.8节,“mysqldump:数据库备份程序”和8.9节,“mysqlhotcopy:数据库备份程序”。

1. 完全备份数据库:

2. shell> mysqldump --tab=/path/to/some/dir --opt db_name
或:

shell> mysqlhotcopy db_name /path/to/some/dir
只要服务器不再进行更新,还可以只复制所有表文件(*.frm、*.MYD和*.MYI文件)。mysqlhotcopy脚本使用该方法。(但请注意如果数据库包含InnoDB表,这些方法不工作。InnoDB不将表的内容保存到数据库目录中,mysqlhotcopy只适合MyISAM表)。

3. 如果mysqld在运行则停止,然后用--log-bin[=file_name]选项来启动。参见5.11.3节,“二进制日志”。二进制日志文件中提供了 执行mysqldump之后对数据库的更改进行复制所需要的信息。

对于InnoDB表,可以进行在线备份,不需要对表进行锁定;参见8.8节,“mysqldump:数据库备份程序”。

MySQL支持增量备份:需要用--log-bin选项来启动服务器以便启用二进制日志;参见5.11.3节,“二进制日志”。当想要进行增量备份时(包含上一次完全备份或增量备份之后的所有更改),应使用FLUSH LOGS回滚二进制日志。然后,你需要将从最后的完全或增量备份的某个时刻到最后某个点的所有二进制日志复制到备份位置。这些二进制日志为增量备份;恢复时,按照下面的解释应用。下次进行完全备份时,还应使用FLUSH LOGS或mysqlhotcopy --flushlogs回滚二进制日志。参见8.8节,“mysqldump:数据库备份程序”和8.9节,“mysqlhotcopy:数据库备份程序”。

如果MySQL服务器为从复制服务器,则无论选择什么备份方法,当备份从机数据时,还应备份master.info和relay-log.info文件。恢复了从机数据后,需要这些文件来继续复制。如果从机执行复制LOAD DATA INFILE命令,你应还备份用--slave-load-tmpdir选项指定的目录中的SQL_LOAD-*文件。(如果未指定,该位置默认为tmpdir变量值)。从机需要这些文件来继续复制中断的LOAD DATA INFILE操作。

如果必须恢复MyISAM表,先使用REPAIR TABLE或myisamchk -r来恢复。99.9%的情况下该方法可以工作。如果myisamchk失败,试试下面的方法。请注意只有用--log-bin选项启动了MySQL从而启用二进制日志它才工作;参见5.11.3节,“二进制日志”。

1. 恢复原mysqldump备份,或二进制备份。

2. 执行下面的命令重新更新二进制日志:

3. shell> mysqlbinlog hostname-bin.[0-9]* | mysql
在某些情况下,你可能只想要从某个位置重新运行某些二进制日志。(通常你想要从恢复备份的日期重新运行所有二进制日志,查询不正确时例外)。关于mysqlbinlog工具和如何使用它的详细信息参见8.6节,“mysqlbinlog:用于处理二进制日志文件的实用工具”。

还可以对具体文件进行选择备份:

· 要想复制表,使用SELECT * INTO OUTFILE 'file_name' FROM tbl_name。

· 要想重载表,使用LOAD DATA INFILE 'file_name' REPLACE ...并恢复。要避免复制记录,表必须有PRIMARY KEY或一个UNIQUE索引。当新记录复制唯一键值的旧记录时,REPLACE关键字可以将旧记录替换为新记录。

如果备份时遇到服务器性能问题,可以有帮助的一个策略是在从服务器而不是主服务器上建立复制并执行备份。参见6.1节,“复制介绍”。

如果使用Veritas文件系统,可以这样备份:

1. 从客户端程序执行FLUSH TABLES WITH READ LOCK。

2. 从另一个shell执行mount vxfs snapshot。

3. 从第一个客户端执行UNLOCK TABLES。

4. 从快照复制文件。

5. 卸载快照。

5.9.2. 示例用备份与恢复策略
5.9.2.1. 备份策略
5.9.2.2. 为恢复进行备份
5.9.2.3. 备份策略摘要
本节讨论进行备份的程序,在出现崩溃后,可以恢复数据:
· 操作系统崩溃

· 电源故障

· 文件系统崩溃

· 硬件问题(硬盘、母板等等)

该命令不包括mysqldump和mysql程序的--user和—password等选项。应包括必要的选项让MySQL服务器允许你连接它。

我们假定数据保存在MySQL的InnoDB存储引擎中,支持事务和自动崩溃恢复。我们假定崩溃时MySQL服务器带负载。如果不带负载,则不需要恢复。

出现操作系统崩溃或电源故障时,我们可以假定重启后硬盘上的MySQLś数据仍可用。由于崩溃,InnoDB数据文件中的数据可能不再保持一致性,但InnoDB读取它的日志并会查到挂起的提交的和未提交的事务清单,它们没有清空到数据文件中。InnoDB自动卷回未提交的事务,并清空到它的数据文件中。通过MySQL错误日志将该恢复过程相关信息传达给用户。下面的例子为日志摘录:

InnoDB: Database was not shut down normally.
InnoDB: Starting recovery
[/Quote]
xq498475373 2011-09-30
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 rucypli 的回复:]
只需要新建库就行

导出用mysqldump -uroot -ppassword dbname > xxx.sql
导入用mysql -uroot -ppassword dbname < xxx.sql
[/Quote]

数据库中的表结构有变化对原来的数据会有影响吗?
rucypli 2011-09-30
  • 打赏
  • 举报
回复
只需要新建库就行

导出用mysqldump -uroot -ppassword dbname > xxx.sql
导入用mysql -uroot -ppassword dbname < xxx.sql
xq498475373 2011-09-30
  • 打赏
  • 举报
回复
现在的问题就是人家不让知道结构 只能让原来的数据库中的数据到新的数据库中去。
ACMAIN_CHM 2011-09-30
  • 打赏
  • 举报
回复
那就把新的也MYSQLDUMP出来,然后找台空服务器恢复,再分析它的结构。
xq498475373 2011-09-30
  • 打赏
  • 举报
回复
现在关键就是我不知道原来的数据库结构,新的数据库结构也不知道。

56,678

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧