MySQL:从SQL查询中转储数据库

时间:2010-01-08 00:19:55

标签: mysql dump

我正在编写一个测试框架,我需要捕获MySQL数据库状态(表结构,内容等)。

我需要这个来实现检查,在某些操作之后状态没有改变。 (允许自动增量值 可以改变,但我想我能够处理这个。)

转储最好应采用人类可读的格式(最好是SQL代码,如mysqldump)。

我希望将我的测试框架限制为仅使用MySQL连接。要捕获状态,它应该调用mysqldump或访问文件系统(如复制* .frm文件或SELECT IN IN文件,管道也可以。)

由于这是仅测试代码,我并不关心性能。我确实需要可靠的行为。

实现我需要的功能的最佳方法是什么?

我想我应该将我的代码基于一些现有的开源备份工具......哪个是最好看的?

更新:我没有指定我写的语言(不,那不是PHP),因为我认为我不能按原样重用代码 - 我的情况是相当特殊(出于实际目的,我们假设MySQL C API)。代码将在Linux上运行。

3 个答案:

答案 0 :(得分:2)

鉴于您的要求,我认为您留下了(伪代码+ SQL)

tables = mysql_fetch "SHOW TABLES"
foreach table in tables
    create = mysql_fetch "SHOW CREATE TABLE table"
    print create
    rows = mysql_fetch "SELECT * FROM table"
    foreach row in rows
        // or could use VALUES (v1, v2, ...), (v1, v2, ...), .... syntax (maybe preferable for smaller tables)
        insert = "INSERT (fiedl1, field2, field2, etc) VALUES (value1, value2, value3, etc)"
        print insert

基本上,获取所有表的列表,然后遍历每个表并手动为每一行生成INSERT语句(大多数api有一种简单的方法来获取列名列表,否则你可以回到致电DESC TABLE)。

SHOW CREATE TABLE已为您完成,但我相当确定没有类似于SHOW INSERT ROWS的内容。

当然,不是打印转储,而是可以随心所欲地做任何事情。

答案 1 :(得分:1)

如果您不想使用命令行工具,换句话说,您希望在php或您使用的任何语言中完全执行此操作,那么为什么不使用SQL本身迭代表。例如,要检查表结构,一种简单的技术是使用SHOW CREATE TABLE table_name捕获表结构的snapsot,存储结果,然后再次进行调用并比较结果。

你看过mysqldump的源代码吗?我相信你想要的大部分都将包含在其中。

DC

答案 2 :(得分:0)

除非您自己构建导出,否则我认为没有简单的解决方案来导出和验证数据。如果您按表格执行,LOAD DATA INFILESELECT ... INTO OUTFILE可能会有所帮助。

我发现每次测试都可以更轻松地重建数据库。至少,我可以知道数据的确切状态。当然,运行这些测试需要更多的时间,但是抽象操作并减少依赖于数据库的测试是一个很好的动机。

我在一些项目中使用的其他替代方案,其中设计不允许这样的良好划分,使用InnoDB或其他一些事务数据库引擎效果很好。只要您跟踪事务或在测试期间禁用它们,您只需在setUp()中启动事务并在tearDown()中回滚。