3

我正在编写一个数据仓库,使用MySQL作为后端。我需要根据两个整数 ID 和一个名称字符串对表进行分区。

一个更具体的例子是假设我正在存储关于一所学校的数据。我想根据 COMPOSITE 'Key' 根据以下内容对 school_data 表进行分区:

school id (integer)
course_id (integer)
student_surname (string)

对于学生的姓氏,它只是姓氏的第一个字符,它决定了数据应该进入哪个“分区表”。

我如何使用 MySQL (5.1) 和 InnoDb 表来实现这个要求?

此外,我正在 Windows 机器上进行开发,但我将部署到 *nix 机器上进行生产。我还有两个问题:

  1. 我假设从 Windows 迁移到 Linux 时我将不得不转储和恢复数据。如果数据库包含分区表,我不知道这是否可以(指向它在文档中声明的位置的指针会让我放心 - 我无法找到任何关于分区表的转储/恢复的具体提及。
  2. 我可能还需要更改数据库(如果 Oracle 对 MySQL 用户采取了意外举措),在这种情况下,我需要以某种方式将数据导出到另一个数据库中。在这种情况下(希望不太可能的情况) - 考虑到分区表,从 MySQL 中转储数据(可能是文本或其他内容)的最佳方法是什么?
4

2 回答 2

4

范围分区

按范围分区的表的分区方式是,每个分区都包含分区表达式值位于给定范围内的行。

CREATE TABLE employees (
  school id (integer)
  course_id (integer)
  student_surname (string)
)
  PARTITION BY RANGE (student_surname) (
  PARTITION p0 VALUES LESS THAN ('ezzzzzzzzzzzzzzzzzzzzzzz'),
  PARTITION p1 VALUES LESS THAN ('ozzzzzzzzzzzzzzzzzzzzzzz'),
  PARTITION p2 VALUES LESS THAN ('tzzzzzzzzzzzzzzzzzzzzzzz'),
  PARTITION p3 VALUES LESS THAN (MAXVALUE)
);

范围分区

数据迁移到另一个数据库

MySQLDUMP 会将表和数据输出到文件中。但是,Oracle支持通过 ODBC 连接到其他数据库,就像 SQL Server 具有链接服务器功能一样。

附录

看起来您仅按我提到的 3 个字段之一(即名称)进行分区。我在 MySQL 文档中看到了单个字段的分区,但没有像我想要的那样使用 3 个字段(int、int、string)。

可以按三列进行分区,但我的示例是根据您在 OP 中的要求:

对于学生的姓氏,它只是姓氏的第一个字符,它决定了数据应该进入哪个“分区表”。

于 2009-12-20T17:27:44.697 回答
3

如何使用带有 InnoDb 表的 mySQL (5.1) 实现此要求?

查看第 18 章MySQL 文档的分区,尤其是分区类型(我会查看HASH分区)。但请记住,MySQL 5.1 中的分区实现仍在开发中,存在一些限制和限制

我假设从 Windows 迁移到 Linux 时我将不得不转储和恢复数据。如果数据库包含分区表,我不知道这是否可以(指向它在文档中声明的位置的指针会让我放心 - 我无法找到任何关于分区表的转储/恢复的具体提及。

我在18.3 分区管理中没有找到任何内容,但是根据这篇文章,备份和恢复分区表并没有什么特别之处。要备份:

mysqldump --opt db_name table_name > file.dump

并恢复:

mysql db_name < file.dump 

不过我会做一些测试。

我可能还需要更改数据库(如果 Oracle 对 mySQL 用户采取了令人惊讶的举措),在这种情况下,我需要以某种方式将数据导出到另一个数据库中。在这种情况下(希望不太可能的情况) - 考虑到分区表,从 mySQL 中转储数据(可能是文本或其他内容)的最佳方法是什么?

Oracle SQL Developer 通过包含重新开发的特性并极大地扩展了原始 Oracle 迁移工作台提供的功能和可用性来整合迁移支持,从而将 Microsoft Access、Microsoft SQL Server、MySQL 和 Sybase 数据库迁移到 Oracle。

于 2009-12-20T17:35:52.467 回答