服务器 频道

MySQL for Linux on POWER-数据库创建简介

  【IT168 服务器学院】MySQL 数据库服务器可以运行在基于 IBM POWER 和 PowerPC 处理器的服务上的 Linux(统称为 Linux on POWER)中,通过本文了解其可用性。作为面向在 Linux on POWER 中使用 MySQL 的应用程序开发者的一篇简短指南,本文适合那些熟悉自己的系统环境、网络、媒体设计和磁盘资源的 MySQL 开发者和数据库管理员阅读。
  
  简介
  
  MySQL 是当前最为流行的开放源代码数据库之一。可以遵循商业化及开放源代码双重许可的模型来使用它。从嵌入式设备到集群企业环境,MySQL 在很多种类的应用程序中得到了应用。
  
  POWER5? 处理器是 IBM PPC? AS 体系结构的最新 64-位 实现(版本 2.02)。它与所有 PPC 和 PPC AS 应用程序级代码都是二进制兼容的(binary compatible)。POWER5 芯片设计用于非常高频率的操作,最高可达 2.0 GHz。Power 体系结构既支持 64-位 寻址,也支持 32-位 寻址。早期的实现使用的是 32-位 子集,只支持 32-位 应用程序。自 1995 年以来,64-位 处理器实现了完整的体系结构,支持与现有 32-位 应用程序的完全二进制应用程序兼容,并完全支持新的 64-位 应用程序。64-位 POWER 和 PPC 芯片已经应用于 IBM? eServer? iSeries?、 pSeries? OpenPower? 和 BladeCenter? JS20 服务器,以及 Apple 的 G5 硬件。
  
  POWER5 体系结构是对 POWER4 体系结构的改进,但是保持了二进制与结构的兼容性。相同的管道结构使得为 POWER4 所生成的处理器代码可以同样好地应用于基于 POWER5 处理器的系统。POWER5 的关键特性包括微分区(micro-partitioning)和同步多线程(Simultaneous Multi-threading)。
  
  Linux 已经在商业和技术计算环境中占据了重要地位,并迅速为多种业务所接受。IBM Linux Technology Center(LTC)是当前世界上最主要的企业 Linux 开发组织,他们主要致力于在 POWER 体系结构上为所有主流 Linux 发行版本提供开发、支持和改进。与来自开放源代码社区的传统支持一道,独立软件提供商(Independent software vendor,ISV)和客户帮助此类支持能够提供一个辅助开发者的空前网络。
  
  MySQL 及相关组件
  
  传统上,在所有主流 Linux 发行版本中都会包含 MySQL。用于 POWER 上的主流 LInux 发行版本,比如 Red Hat Enterprise Linux 和 SUSE LINUX Enterprise Server,也不例外。
  
  虽然不同的 Linux 发行版本中会有不同的 MySQL 和 MySQL 产品软件包和版本,不过应该都会有下面这些:
  
  数据库服务器(Database Server)
  数据库客户机(Database Client)
  流行编程语言的接口与扩展,比如 Java、C/C++、Python、Perl、PHP,等等
  用于不同产品和开发 API 的程序库、模块和插件
  与 MySQL 相关的其他工具
  
  要获得产品的详细列表和描述,请参考在 参考资料 中列出的最主要的 MySQL 资源中心,MySQL.com。 MySQL.com Web 站点是 MySQL 资料和产品下载的主要资源,其中包括用于 Linux on POWER 的下载。从该站点上可以下载用于 Linux on POWER 的已编译的最新 MySQL 版本和相关产品,同样也可以下载源代码。
  
  可以以若干种方式获得 MySQL 数据库。有一些可以遵循双重的商业和开放源代码许可获得,有一些只能遵循某个商业许可获得。要获得更多信息,请参考 MySQL 数据库服务器网页(参阅 参考资料)。
  
  操作系统和硬件
  
  本文主要涉及了 IBM 支持的、用于 POWER 硬件的两个 Linux on POWER 发行版本:
  
  Red Hat Enterprise Linux
  SUSE LINUX Enterprise Server
  
  用于 MySQL for Linux on POWER 也可以运行在其他 Linux 发行版本上,比如 Yellow Dog Linux、Y-HPC、Debian 和很多其他运行于 IBM 和 Apple 所制造的 POWER 和 PPC 硬件上的发行版本。
  
  在 Linux on POWER 上安装 MySQL
  在 Linux on POWER 上安装 MySQL 与在任何其他体系结构上的 Linux 操作系统中安装没有区别。
  
  如果您使用的是 POWER 上 Linux 发行版本中所包含的 MySQL 程序包,那么安装 MySQL 非常简单,只需要通过发行版本的媒介安装所需的 rpm 软件包。MySQL.com Web 站点也以 Linux 社区通常接受的压缩格式提供了 POWER 和 PPC 上 Linux 的下载。
  
  MySQL 本身及很多工具的源代码只是遵循开放源代码许可提供,可以在 POWER 上 Linux 中使用 GNU Compiler Collection(GCC)方便地进行编译。
  

  MySQL 管理工具
  
  有一些 MySQL 管理工具,它们使用交互式图形界面,简化了 MySQL 数据库的管理。
  
  MySQL Administrator
  MySQL Administrator 让您能够配置、备份/恢复、控制您的数据库以及 MySQL 服务器环境。 图 1 是在 POWER 上 Linux SLES 9 中运行的 MySQL Administrator 截图,展示了我们将要在下一节中创建的数据库结构。
  
  图 1. MySQL Administrator 窗口
   

  可以在 POWER 上 Linux 中编译 MySQL Administrator 源代码。要获得关于 MySQL Administrator 的更多资料,请访问 MySQL Administrator 网页。(参阅 参考资料。)
  
  MySQL 查询浏览器(Query Browser)
  MySQL 查询浏览器是一个易用的图形化工具,可以用来创建、执行和优化 MySQL 中的查询。图 2 给出了在 POWER 上 Linux SLES 9 中运行的 MySQL 查询浏览器窗口截图。
  
  图 2. MySQL 查询浏览器
   

  类似于 MySQL Administrator,也可以获得 MySQL 查询浏览器的源代码并在 Linux on POWER 中编译它。要获得关于 MySQL 查询浏览器的更多资料,请访问 MySQL 查询浏览器网页。(参阅 参考资料。)
  
  phpMyAdmin
  phpMyAdmin 是另一个 MySQL 管理和控制工具。这个工具完全用 PHP 编写,如果有以下组件的支持,可以在任意 Linux 发行版本上应用:
  
  PHP 运行期环境
  具有 PHP 模块的 Apache web 服务器
  PHP-MySQL 模块
  
  Linux on POWER 发行版本默认会附带这些组件。配置很简单,在 phpMyAdmin 附带的文档中详细地进行了描述。 图 3 是在 Linux on POWER SLES 9 中运行的 phpMyAdmin 的截图。
  
  图 3. phpMyAdmin
   

  要获得更多资料并下载 phpMyAdmin,请访问 phpMyAdmin Web 站点。(参阅 参考资料。)
  
  迁移 MySQL
  如果使用前面提到的管理工具,迁移 MySQL 数据库非常简单,因为 MySQL 数据库表结构保存在文件中,您可以将它们备份和拷贝到其他系统。要获得更多资料,请参考 MySQL 文档。
  

  创建 MySQL 数据库
  为了介绍一些关键的 MySQL 概念以及一些您可以在 MySQL 中执行的基本任务,文章的这一节将讨论一个简单的数据库设计。
  
  数据库设计
  此示例研究了一个简单的数据库,它保持了对某个 IT specialists contracting company 日常活动的追踪。 图 4 是一个实体关系图(Entity Relational Diagram,ERD),给出了公司简化的数据需求及操作宏观视图。
  
  图 4. IT Specialists contracting company 数据库
  

  公司约定 IT 专家去从事不同客户的项目,并基于已经确定的价格按小时收取所提供服务的费用。JOB 表保持对客户为服务付费的每小时价格的追踪,那些价格取决于工作的类型。EMPLOYEE 表保持对雇员信息的追踪,其中包括雇员的职位,是指向 JOB 表中一个条目的外部关键字。JOB 表与 EMPLOYEE 表是 1:M 的任意关系。有可能存在某个职位而并没有相应雇员。另一方面,雇员需要拥有恰好一个主要职位。
  
  PROJECT 表保存的是关于此公司所涉及到的项目的数据。一个项目必须恰好由公司的一位雇员来管理。有可能某个雇员会管理多于一个项目。不过,并不是每个雇员都会管理项目。
  
  每位雇员会得到一张定单表格,在那张表格上他们记录每天为客户的具体项目工作了多少个小时,每小时价格是多少,以及要向客户收取的总费用。
  
  一个雇员可以一次被指派到多个项目,或者一个项目都不指派。可能会有多个雇员为某个项目工作,或者一个也没有。这个 N:N 的关系通过联合实体 ORDERFORM 实现。
  
  数据库中的所有表都按第三范式(3rd Normal Form,3NF)进行了标准化,所以我们可以开始创建基于前面的 ERD 的数据库结构。
  
  创建数据库
  首先,您需要启动 MySQL 客户机,并登录进入 MySQL:
  
  shell> mysql -h host -u user -p
  Enter password: ********
  
  成功地登录进入并获得 MySQL 命令行界面提示符后,可以开始创建数据库,如下:
  
  mysql> CREATE DATABASE CONTRACTING;
  Query OK, 1 row affected (0.00 sec)
  
  要确认 CONTRACTING 数据已经创建,执行下面的命令并得到如下的输出:
  
  mysql> SHOW DATABASES;
  +-------------+
  | Database  |
  +-------------+
  | CONTRACTING |
  | mysql    |
  | test    |
  +-------------+
  
  注意,SQL 代码和 MySQL 内部命令的大写是可选的,但是数据库的名称、表和列都对大小写敏感。例如,名为 “TEST" 的数据库不同于名为 “test" 的数据库。
  
  现在需要切换到新创建的数据库:
  
  mysql> USE CONTRACTING
  Database changed
  
  此时,您就已经准备好在数据库中开始创建表。可以首先创建 JOB 表,如下:
  
  mysql> CREATE TABLE JOB (
  -> JOB_CODE INTEGER NOT NULL UNIQUE,
  -> JOB_NAME LONG VARCHAR NOT NULL,
  -> JOB_HOUR_CHRG DECIMAL(10,2) NOT NULL,
  -> PRIMARY KEY (JOB_CODE)) ENGINE=InnoDB;
  Query OK, 0 rows affected (0.03 sec)
  
  将 JOB 表的类型指定为 InnoDB,以保证参照完整性。查看创建的表的参数,如下:
  
  mysql> describe JOB;
  +---------------+---------------+------+-----+---------+-------+
  | Field     | Type     | Null | Key | Default | Extra |
  +---------------+---------------+------+-----+---------+-------+
  | JOB_CODE   | int(11)    |   | PRI | 0    |    |
  | JOB_NAME   | mediumtext  |   |   |     |    |
  | JOB_HOUR_CHRG | decimal(10,2) |   |   | 0.00  |    |
  +---------------+---------------+------+-----+---------+-------+
  3 rows in set (0.00 sec)
  

  以类似的方式创建其余的表。MySQL 允许您以非交互、批处理的方式执行语句。您可以将所有的数据库创建 SQL 代码存入一个文本文件,然后从那里执行它。下面是一个此类文件的示例:
  
  -- Creating the database
  CREATE DATABASE CONTRACTING;
  
  -- Changing into the CONTRACTING database
  USE CONTRACTING;
  
  -- Creating table JOB
  CREATE TABLE JOB (
  JOB_CODE INTEGER NOT NULL UNIQUE,
  JOB_NAME LONG VARCHAR NOT NULL,
  JOB_HOUR_CHRG DECIMAL(10,2) NOT NULL,
  PRIMARY KEY (JOB_CODE)) ENGINE=InnoDB;
  
  -- Creating table EMPLOYEE
  CREATE TABLE EMPLOYEE (
  EMP_SSN CHAR(9) NOT NULL UNIQUE,
  EMP_LNAME VARCHAR(50) NOT NULL,
  EMP_FNAME VARCHAR(50) NOT NULL,
  JOB_CODE INTEGER NOT NULL,
  PRIMARY KEY (EMP_SSN),
  FOREIGN KEY (JOB_CODE) REFERENCES JOB(JOB_CODE)
  ON UPDATE CASCADE
  ON DELETE RESTRICT) ENGINE=InnoDB;
  
  -- Creating table PROJECT
  CREATE TABLE PROJECT (
  PRJ_NUM INTEGER NOT NULL UNIQUE,
  PRJ_NAME VARCHAR(50) NOT NULL,
  EMP_SSN CHAR(9) NOT NULL,
  PRIMARY KEY (PRJ_NUM),
  FOREIGN KEY (EMP_SSN) REFERENCES EMPLOYEE(EMP_SSN)
  ON UPDATE CASCADE
  ON DELETE RESTRICT) ENGINE=InnoDB;
  
  -- Creating table ORDERFORM
  CREATE TABLE ORDERFORM (
  ORD_NUM INTEGER NOT NULL UNIQUE,
  ORD_DATE DATE NOT NULL,
  ORD_HOURS SMALLINT NOT NULL,
  ORD_CHRG_HOUR DECIMAL(10,2) NOT NULL,
  ORD_CHARGE DECIMAL(10,2) NOT NULL,
  PRJ_NUM INTEGER NOT NULL,
  EMP_SSN CHAR(9) NOT NULL,
  PRIMARY KEY (ORD_NUM),
  FOREIGN KEY (EMP_SSN) REFERENCES EMPLOYEE(EMP_SSN)
  ON UPDATE CASCADE
  ON DELETE RESTRICT,
  FOREIGN KEY (PRJ_NUM) REFERENCES PROJECT(PRJ_NUM)
  ON UPDATE CASCADE
  ON DELETE RESTRICT) ENGINE=InnoDB;
  
  注意创建表的顺序。被参照的表必须在进行参照的表之前创建。如果您将表的类型指定为 InnoDB,那么这个顺序就不会那么重要。不过,参照完整性将得不到保证。
  
  要深入了解 MySQL 参照完整性,请参考 MySQL 产品文档中关于外部关键字的部分。
  
  要通过上述文件执行 SQL 语句,您只需要在命令行中将其传递给 mysql,就可以读取文件,类似这样:
  
  mysql -u username < filename
  
  要深入了解 MySQL 的批处理使用模式,请参考 MySQL 产品文档。
  
  要查看您创建的表结构,请输入下面的命令:
  
  mysql> SHOW TABLES;
  +-----------------------+
  | Tables_in_CONTRACTING |
  +-----------------------+
  | EMPLOYEE       |
  | JOB          |
  | ORDERFORM       |
  | PROJECT        |
  +-----------------------+
  4 rows in set (0.00 sec)
  
  mysql> DESCRIBE JOB;
  +---------------+---------------+------+-----+---------+-------+
  | Field     | Type     | Null | Key | Default | Extra |
  +---------------+---------------+------+-----+---------+-------+
  | JOB_CODE   | int(11)    |   | PRI | 0    |    |
  | JOB_NAME   | mediumtext  |   |   |     |    |
  | JOB_HOUR_CHRG | decimal(10,2) |   |   | 0.00  |    |
  +---------------+---------------+------+-----+---------+-------+
  3 rows in set (0.00 sec)
  
  mysql> DESCRIBE EMPLOYEE;
  +-----------+-------------+------+-----+---------+-------+
  | Field   | Type    | Null | Key | Default | Extra |
  +-----------+-------------+------+-----+---------+-------+
  | EMP_SSN  | varchar(9) |   | PRI |     |    |
  | EMP_LNAME | varchar(50) |   |   |     |    |
  | EMP_FNAME | varchar(50) |   |   |     |    |
  | JOB_CODE | int(11)   |   | MUL | 0    |    |
  +-----------+-------------+------+-----+---------+-------+
  4 rows in set (0.00 sec)
  
  mysql> DESCRIBE PROJECT;
  +----------+-------------+------+-----+---------+-------+
  | Field  | Type    | Null | Key | Default | Extra |
  +----------+-------------+------+-----+---------+-------+
  | PRJ_NUM | int(11)   |   | PRI | 0    |    |
  | PRJ_NAME | varchar(50) |   |   |     |    |
  | EMP_SSN | varchar(9) |   | MUL |     |    |
  +----------+-------------+------+-----+---------+-------+
  3 rows in set (0.01 sec)
  
  mysql> DESCRIBE ORDERFORM;
  +---------------+---------------+------+-----+------------+-------+
  | Field     | Type     | Null | Key | Default  | Extra |
  +---------------+---------------+------+-----+------------+-------+
  | ORD_NUM    | int(11)    |   | PRI | 0     |    |
  | ORD_DATE   | date     |   |   | 0000-00-00 |    |
  | ORD_HOURS   | smallint(6)  |   |   | 0     |    |
  | ORD_CHRG_HOUR | decimal(10,2) |   |   | 0.00    |    |
  | ORD_CHARGE  | decimal(10,2) |   |   | 0.00    |    |
  | PRJ_NUM    | int(11)    |   | MUL | 0     |    |
  | EMP_SSN    | char(9)    |   | MUL |      |    |
  +---------------+---------------+------+-----+------------+-------+
  7 rows in set (0.00 sec)
  
  注意,在 EMPLOYEE 表中,属性 EMP_SSN 的类型被从 CHAR(9) 转换为 VARCHAR(9)。如果一个表有一个 VARCHAR 类型的列,那么同一个表中长度大于 CHAR(3) 的 CHAR 类型会被转换为 VARCHAR 类型。当在同一张表中同时存在 CHAR 和 VARCHAR 类型时,这一转换会提高性能。
  
  输入数据,并确认参照完整性
  
  此时您就已经完成了数据库中表的创建,可以开始向表中填入数据。为此,可以使用 INSERT 语句,也可以从以制表符定界的文本文件中将数据导入表中。
  
  INSERT INTO JOB (JOB_CODE, JOB_NAME, JOB_HOUR_CHRG)
  VALUES (200, ''Application Designer'', 38.50);
  
  要查看 JOB 表中加入的条目,请输入下面的内容:
  
  mysql> SELECT * FROM JOB;
  +----------+----------------------+---------------+
  | JOB_CODE | JOB_NAME       | JOB_HOUR_CHRG |
  +----------+----------------------+---------------+
  |   200 | Application Designer |     38.50 |
  +----------+----------------------+---------------+
  1 row in set (0.00 sec)
  
  要通过文本文件向数据库填入数据,需要创建一个以制表符定界的文件。可以使用下面的示例文件来导入 JOB 表:
  
  200   Application Programmer 35.48
  201   Database Administrator 38.50
  202   Technical Support    27.00
  203   Database Designer    49.99
  
  要通过这个文件导入数据,需要执行类似如下的命令:
  
  mysql> LOAD DATA LOCAL INFILE "job_data_load.txt" INTO TABLE JOB;
  Query OK, 4 rows affected (0.00 sec)
  Records: 4 Deleted: 0 Skipped: 0 Warnings: 0
  
  注意,如果文本文件不在启动 mysql 客户机的同一目录,则需要指定那个文件的绝对路径。在 LOAD DATA 语句中可以修改列值分隔符的缺省值。要获得关于从文本文件导入数据的更多资料,请参考 MySQL 产品文件。
  
  要确认结果,请打印出 JOB 表中的所有行,如下:
  
  mysql> SELECT * FROM JOB;
  +----------+------------------------+---------------+
  | JOB_CODE | JOB_NAME        | JOB_HOUR_CHRG |
  +----------+------------------------+---------------+
  |   200 | Application Programmer |     35.48 |
  |   201 | Database Administrator |     38.50 |
  |   202 | Technical Support   |     27.00 |
  |   203 | Database Designer   |     49.99 |
  +----------+------------------------+---------------+
  4 rows in set (0.00 sec)
  
  同样,您可以填入其他表,记住,由于您使用的是 InnoDB 表类型,参照完整性是强制性的,因此,必须在填入进行参照的表之前先填入被参照的表。
  
  比如,向 EMPLOYEE 表填入下面的数据:
  
  mysql> SELECT * FROM EMPLOYEE;
  +-----------+-----------+-----------+----------+
  | EMP_SSN  | EMP_LNAME | EMP_FNAME | JOB_CODE |
  +-----------+-----------+-----------+----------+
  | 600000001 | Smith   | John   |   201 |
  | 600000002 | Johnson  | James   |   200 |
  | 600000003 | Jones   | Anne   |   203 |
  +-----------+-----------+-----------+----------+
  3 rows in set (0.00 sec)
  
  举例来说,您所指定的外部关键字约束将不允许您删除 JOB 表中 JOB_CODE 等于 203 的记录,因为有一位雇员,即 Anne Jones,他在 EMPLOYEE 表中的记录包含此工作代码。
  
  mysql> DELETE FROM JOB WHERE JOB_CODE=203;
  ERROR 1217 (23000): Cannot delete or update a parent row: a foreign
  key constraint fails
  
  可见,参照完整性规则不允许您删除正在由其他表参照的记录。不过,如果更新 JOB 表中的 JOB_CODE,那么进行参照的表也要进行这一更新,如下所示:
  
  mysql> UPDATE JOB SET JOB_CODE=207 WHERE JOB_CODE=203;
  Query OK, 1 row affected (0.02 sec)
  Rows matched: 1 Changed: 1 Warnings: 0
  
  mysql> SELECT * FROM JOB;
  +----------+------------------------+---------------+
  | JOB_CODE | JOB_NAME        | JOB_HOUR_CHRG |
  +----------+------------------------+---------------+
  |   200 | Application Programmer |     35.48 |
  |   201 | Database Administrator |     38.50 |
  |   202 | Technical Support   |     27.00 |
  |   207 | Database Designer   |     49.99 |
  +----------+------------------------+---------------+
  4 rows in set (0.00 sec)
  
  mysql> SELECT * FROM EMPLOYEE;
  +-----------+-----------+-----------+----------+
  | EMP_SSN  | EMP_LNAME | EMP_FNAME | JOB_CODE |
  +-----------+-----------+-----------+----------+
  | 600000001 | Smith   | John   |   201 |
  | 600000002 | Johnson  | James   |   200 |
  | 600000003 | Jones   | Anne   |   207 |
  +-----------+-----------+-----------+----------+
  3 rows in set (0.00 sec)
  
  为 MySQL 进行开发
  
  由于 MySQL 的流行,有大量的开发团体在使用大部分主流编程调语言为 MySQL 编写应用程序。在 Linux 中(包括 Linux on POWER)有很多 API,让您能够使用以下编程语言编写与 MySQL 通信的应用程序,比如 PHP、Java、C、C++、Perl、Python 和 Ruby,这只是列出了很少的一些。在本系列的 第 2 部分 中深入了解在 Linux on POWER 上为 MySQL 所做的开发。
  
  结束语
  
  人们普遍认为 MySQL 是当前可用的性能较好的开放源代码企业级 Linux 关系数据库服务器之一。IBM 64-位 POWER 平台具备出众的性能、可靠性和高可用性,能够满足现今客户的所有需求。MySQL RDBMS 具备强健的特性,基于 IBM POWER 处理器的服务器具备微分区、动态启用和禁用 SMT 的能力,它们联合起来为市场提供了一个最为强大的 Linux 数据库服务器平台。
0
相关文章