简介
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 数据库服务器平台。
