MS Access to MySQL 转换帮助(巨大的表)

MS Access to MySQL Conversion help (Gigantic table)

提问人:Madara's Ghost 提问时间:8/9/2011 更新时间:12/5/2013 访问量:2185

问:

所以我有这个巨大的表,包含大约700万条记录,在MS Access(*.mdb)中,我想将其转换为更可行的MySQL格式,并将其存储在我的Web服务器上。文件本身重量为 2GB。

问题是,由于表太大,它不允许我正常导出它(Access 说限制是 65,536 条记录。

我尝试了一些第三方软件,但无济于事。

任何人都可以推荐一种干净的方法,而不会损坏内部数据吗?

提前感谢您的任何帮助。

mysql ms-access 导出

评论

0赞 Mchl 8/9/2011
也许尝试先迁移到 MS SQL Server,然后再迁移到 MySQL?
0赞 Madara's Ghost 8/9/2011
不幸的是,我没有这样的服务器......
4赞 Mchl 8/9/2011
你去吧:microsoft.com/sqlserver/en/us/editions/express.aspx
0赞 Madara's Ghost 8/9/2011
恐怕 78MB 对于我的手机供电的不稳定连接来说有点太多了。回家后会尝试一下,谢谢你的帮助。
0赞 David-W-Fenton 8/11/2011
你用什么方法导出它?65,536 的限制并不认为这是一个适用于每种可用导出方法的限制。

答:

1赞 Albert D. Kallal 8/9/2011 #1

是紧凑+维修后的700万价值吗?我的意思是,如果每条记录的长度约为 120 个字符,则可以在 2 次演出中容纳 3200 万条记录。

此外,我不知道导出 65,000 条记录的限制,但仅限于 Excel。

因此,您可以/应该能够将数据导出为 csv,然后在 mySql 中使用批量文本导入来提取该数据。因此,请尝试将表格导出为 csv。这应该有效。

我的意思是,如果您与 sql 服务器有良好的本地连接,您可以通过 odbc 链接表,但如果没有,那么我会导出到 csv(它非常快)。然后我会压缩文件(他们压缩得很棒)。将文件上传到服务器,解压缩,然后使用批量文本导入。因此,这样的压缩文件非常小,可以节省大量的传输时间。

您也可以考虑使用制表符分隔,因为 mySql 也可以导入这些,但一个简单的文本文件应该可以正常工作。

评论

0赞 Madara's Ghost 8/10/2011
我有大约 20 列来描述每条记录。虽然我不能说这张桌子是 100% 有效的(不是我做的)。另外,服务器是本地的,我将尝试CSV方式并返回给您。
0赞 Madara's Ghost 8/14/2011
@David它对我有用。想要截图吗?(也许我做错了,开导我)。
0赞 David-W-Fenton 8/16/2011
您如何检查它是否具有该限制?您是否在Excel中打开生成的CSV文件?如果是这样,那么 Excel 就是问题所在——用记事本打开它,你会看到那里的所有数据。我刚刚将一个包含 700 万行的表导出到一个逗号分隔的文件中。
1赞 Xavier Combelle 8/13/2011 #2

我会使用 pyodbc,如

http://en.wikibooks.org/wiki/Python_Programming/Database_Programming

http://python.org/ 下载 Python 2.7 下载 http://code.google.com/p/pyodbc/

修改以下 coede 以根据您的表和文件设置 myfile.mdb 和 MyTable

将代码保存在文件 translate.py

import csv
mycsv = csv.writer(open('result.csv', 'wb'), delimiter=',',
                    quotechar='"', quoting=csv.QUOTE_MINIMAL)
import pyodbc

DBfile = 'myfile.mdb'
conn = pyodbc.connect('DRIVER={Microsoft Access Driver (*.mdb)};DBQ='+DBfile)
cursor = conn.cursor()

SQL = 'SELECT * FROM MyTable;'
for row in cursor.execute(SQL): # cursors are iterable
    mycsv.writerow(row)

cursor.close()
conn.close()

python translate.py

评论

0赞 Madara's Ghost 8/13/2011
恐怕我不会用python编程,我不知道我需要什么工具,我也不想开始学习。
0赞 Madara's Ghost 8/13/2011
就像我说的,我不打算使用 Python 来完成这项工作。如果您有PHP解决方案,我很乐意对其进行测试。
8赞 HansUp 8/13/2011 #3

如果还没有 MySQL 的 ODBC 驱动程序,请安装一个。最新版本可在此处获得:下载 Connector/ODBC

从 Windows ODBC 数据源管理器为 MySQL 服务器创建 DSN(数据源名称)。

然后,在 Access 2003 中,在“数据库”窗口中选择表,然后选择“文件”->从 Access 导出“主菜单。在“将表'yourtablename'导出到...”对话框中,从“保存类型”下拉列表(位于对话框底部)中选择“ODBC Databases()”。下一个对话框允许您指定MySQL将用于导出表的名称,并且默认为Access表名称。单击“确定”后,您将看到另一个对话框“选择数据源”,您可以在其中选择 DSN for MySQL。在该对话框中单击“确定”后,您可能会再次收到一个要求您输入用户名和密码的对话框。提供它们,然后单击“确定”。

希望您的表能够正确传输。但是,我从未使用MySQL进行过该操作。它对我适用于将 ODBC 传输到 SQL Server 和 PostGreSQL。所以我不明白为什么它也不适用于MySQL。

此外,我从未尝试过一次性导出 700 万条唱片。如果它窒息,我们将不得不想出一个解决方法。

如果您使用的是 Access 2007 而不是 2003,请从功能区的“导出”部分开始查找类似的选项。

我之所以建议采用这种方法,是因为在我的印象中,这种导出将是一次性的,因此我认为 Access UI 导出方法最简单。但是,您可以使用 DoCmd.TransferDatabase 方法和 ODBC DSN 对 VBA 代码执行基本相同的操作。

另一种选择是在MySQL中创建兼容的表结构,在Access中创建指向MySQL目标表的链接(再次使用DSN),然后从Access运行“追加查询”:

INSERT INTO link_to_mysql_table (field1, field2, field3, etc)
SELECT field1, field2, field3, etc
FROM access_table;

追加查询方法在导出阻塞 700 万条记录时可能很有用。您可以添加一个 WHERE 子句,将 SELECT 查询的输出记录集限制为可管理的区块大小,然后使用不同的 WHERE 重复以指定另一个区块。

评论

0赞 Madara's Ghost 8/13/2011
我正在使用 ACCESS 2010,我将尝试在此基础上实现您的解决方案,如果您找到方法,请告诉。
0赞 Madara's Ghost 8/13/2011
好吧,它开始导出,还没有错误!所以我很乐观!这可能就是这样!它窒息了,但是哎呀,让它跑一整夜,我做一次,它
0赞 Madara's Ghost 8/13/2011
噢,它失败了。磁盘上的临时空间过大或不足(最大 2GB)。将尝试您的第二种方法
0赞 HansUp 8/13/2011
坚果!第二种方法,您的意思是使用 WHERE 子句追加查询来限制传输的行数吗?这就是我接下来要尝试的那个。
0赞 Madara's Ghost 8/13/2011
是的。我也试过链接,不好。我目前正在尝试逐件出口(百万:P)
0赞 Tony Toews 8/16/2011 #4

在您自己的系统上安装MySQL并对其进行扩展,而不是尝试使用本地服务器。然后运行从 MySQL 到服务器实例的追加查询。

评论

0赞 Madara's Ghost 8/16/2011
我已经在本地计算机上安装了 MySQL,如何从 ACCESS 转移到它?
0赞 Tony Toews 8/16/2011
请参阅有关MySQL等ODBC驱动程序的答案。尽管我可能会在MySQL的本地副本中创建该表,并从Access内部链接到它。确保 MySQL 表上没有索引,以便尽可能快。然后,从 Access 运行对 MySQL 表的追加查询。