Home  >  Article  >  Database  >  将数据库从 MySQL 移植到 MemSQL

将数据库从 MySQL 移植到 MemSQL

WBOY
WBOYOriginal
2016-06-07 17:14:551067browse

因为 MemSQL 完全兼容 MySQL,因此将数据从 MySQL 迁移到 MemSQL 上是非常直接的,你可以使用标准的 MySQL 工具来迁移。本例子假

因为 MemSQL 完全兼容 MySQL,因此将数据从 MySQL 迁移到 MemSQL 上是非常直接的,你可以使用标准的 MySQL 工具来迁移。

本例子假设你的 MySQL 和 MemSQL 都跑在同一台机器上,MySQL 在 3306 端口,而 MemSQL 在 3307 端口,同时假设二者都可以通过 root 账号无需密码访问。

使用 mysqldump 工具移植

mysqldump 是 MySQL 客户端最常用的数据备份工具之一,它会生成一些列创建表和插入数据的SQL语句,因此用来恢复一个数据库是最方便的。

当你确定要将数据迁移到 MemSQL 之前,有几个注意事项:

  • 大多数 MySQL 存储引擎都是使用 B-tree 来存储索引的,而 MemSQL 是使用单向无锁的 skip 列表或者无锁的哈希表。选择正确的索引数据结构对应用程序的性能会有显著的提升。其中哈希表主要适合 key-value 的查找,而 skip 列表特别适合用于复杂范围的扫描和排序(ORDER BY)。因此在进行迁移之前,你得重新审视你得表定义并确定是否能使用 MemSQL 专有的优化。默认的 BTREE 符号将被转成升序的 skip 列表。如果你需要对某个列做双向的范围扫描,你可以考虑同时增加升序和降序的索引,更多 MemSQL 的索引信息请看 indexes
  • 因为 code generation 的缘故,  MemSQL 首次加载数据库结构的速度要比 MySQL 慢,因为 MemSQL 首次加载表结构时,会生成并编译代码来实现这个表的架构,包括内存分配、插入、删除和迭代方法等等。一旦表被编译完成,MemSQL 将在整个运行期间直接使用编译好的代码。而 mysqldump 生成的 INSERT 语句也将特别编译一次。
  • mysqldump 会生成一些 MemSQL 不支持的 SQL 语句,例如不支持 UNIQUE_CHECKS,为了更好的支持 mysqldump,MemSQL 对这些不支持的语句只是予以警告,可通过调整 warn_level 变量来控制错误的级别,详情请看 Unsupported Features . 某些 CREATE TABLE 语句可能被完全阻止执行,如果你遇见这种问题,只能手工去修改表的定义SQL。
  • 如果你运行 MemSQL 的机器没有足够的内存来加载数据,服务器将会对 INSERT 语句执行报 out-of-memory 的错误信息,这种情况你只能安装更多的内存。如果你将已有的 memsqlbin 目录复制到新的机器上,那么MemSQL 会继续沿用已编译的表定义和 INSERT 语句。如果你使用的是 MemSQL 开发版,而且超过了10G 的限制,那你可以参考 memsql.com/next 来了解如何升级。
  • 建议你将数据库结构定义和数据分开独立文件存放,这样就可以在需要的时候来调整表结构,你可以使用下面命令来分别导出数据库结构和数据文件:

    $ mysqldump -h 127.0.0.1 -u root -B [database name] --no-data > schema.sql$ mysqldump -h 127.0.0.1 -u root -B [database name] --no-create-info > data.sql

    然后通过下面方法导入:

    $ mysql -h 127.0.0.1 -u root -P 3307 $ mysql -h 127.0.0.1 -u root -P 3307

    运行这些步骤时,你可以观察 memsql_tracelog (同时也输出到 stderr)  来查看执行过程中被忽略的不被支持的特性。一旦导入完成后,你可以连接到 MemSQL 并查询结果。

    转换你的应用程序

    让应用程序支持 MemSQL 非常简单,只需要改连接配置即可。

    注意

    如果你要连接到本机的 MemSQL 应该使用 127.0.0.1 而不是 localhost,,多数 MySQL 客户端可将 localhost 解析并使用 MySQL 的 socket 文件进行连接而忽略端口设置,详情请看 this page

    一旦你开始运行程序,可监控 memsql_tracelog. 一些不支持的SQL语法会在这里显示。更多 MemSQL 的 SQL Statements

    linux

    Statement:
    The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn