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 資料和產品下載的主要資源,其中包括用於 POWER 上 Linux 的下載。從該站點上可以下載用於 POWER 上 Linux 的已編譯的最新 MySQL 版本和相關產品,同樣也可以下載源代碼。
可以以若干種方式獲得 MySQL 數據庫。有一些可以遵循雙重的商業和開放源代碼許可獲得,有一些只能遵循某個商業許可獲得。要獲得更多信息,請參考 MySQL 數據庫服務器網頁(參閱 參考資料)。
操作系統和硬件
本文主要涉及了 IBM 支持的、用於 POWER 硬件的兩個 POWER 上 Linux 發行版本:
Red Hat Enterprise Linux
SUSE Linux Enterprise Server
用於 POWER 上 Linux 的 MySQL 也可以運行在其他 Linux 發行版本上,比如 Yellow Dog Linux、Y-HPC、Debian 和很多其他運行於 IBM 和 Apple 所制造的 POWER 和 PPC 硬件上的發行版本。
在 POWER 上 Linux 中安裝 MySQL
在 POWER 上 Linux 中安裝 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 查詢浏覽器的源代碼並在 POWER 上 Linux 中編譯它。要獲得關於 MySQL 查詢浏覽器的更多資料,請訪問 MySQL 查詢浏覽器網頁。(參閱 參考資料。)
PHPMyAdmin
phpMyAdmin 是另一個 MySQL 管理和控制工具。這個工具完全用 PHP 編寫,如果有以下組件的支持,可以在任意 Linux 發行版本上應用:
PHP 運行期環境
具有 PHP 模塊的 apache web 服務器
PHP-MySQL 模塊
POWER 上 Linux 發行版本默認會附帶這些組件。配置很簡單,在 phpMyAdmin 附帶的文檔中詳細地進行了描述。 圖 3 是在 POWER 上 Linux SLES 9 中運行的 PHPMyAdmin 的截圖。
圖 3. PHPMyAdmin
遷移 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 部分 中深入了解在 POWER 上 Linux 中為 MySQL 所做的開發。
結束語
人們普遍認為 MySQL 是當前可用的性能最好的開放源代碼企業級 Linux 關系數據庫服務器之一。IBM 64-位 POWER 平台具備出眾的性能、可靠性和高可用性,能夠滿足現今客戶的所有需求。MySQL RDBMS 具備強健的特性,基於 IBM POWER 處理器的服務器具備微分區、動態啟用和禁用 SMT 的能力,它們聯合起來為市場提供了一個最為強大的 Linux 數據庫服務器平台