database server standard operation procedureebooks.lib.ntu.edu.tw/1_file/oss/84/sop-mysql.pdf ·...

98
COSA-SOP-2003-006 Version 1.00 資料庫伺服器 資料庫伺服器 資料庫伺服器 資料庫伺服器 架設標準作業程序書 架設標準作業程序書 架設標準作業程序書 架設標準作業程序書 DataBase Server Standard Operation Procedure 中華民國開放系統協會 CHINESE OPEN SYSTEMS ASSOCIATION

Upload: lythuan

Post on 29-Jul-2018

234 views

Category:

Documents


0 download

TRANSCRIPT

COSA-SOP-2003-006

Version 1.00

資料庫伺服器資料庫伺服器資料庫伺服器資料庫伺服器 架設標準作業程序書架設標準作業程序書架設標準作業程序書架設標準作業程序書

DataBase Server

Standard Operation Procedure

中華民國開放系統協會

CHINESE OPEN SYSTEMS ASSOCIATION

中 華 民 國 九 十 二 年 十 月

1

目錄目錄目錄目錄

第一章第一章第一章第一章 簡介簡介簡介簡介..................................................................................................... 3

1.1 適用對象 (AUDIENCE).............................................................................. 3

1.2 MYSQL 本身........................................................................................... 3

1.3 MYSQL 4.0 版跟 5.0 版重大的改進功能.................................................. 5

1.4 各家資料庫軟體比較 .............................................................................. 6

第二章第二章第二章第二章 前置需求前置需求前置需求前置需求 ............................................................................................. 9

第三章第三章第三章第三章 安裝安裝安裝安裝................................................................................................... 10

3.1 MYSQL 安裝......................................................................................... 10

3.2 PHPMYADMIN 安裝 ................................................................................. 15

3.3 升級及注意事項 ................................................................................... 22

第四章第四章第四章第四章 MYSQL 管理管理管理管理 ..................................................................................... 25

4.1 WEBMIN 管理介面................................................................................. 25

4.1.2 建立資料庫 .................................................................................... 25

4.1.2 建立資料表.................................................................................... 28

4.1.3 使用者管理.................................................................................... 33

4.2 PHPMYADMIN 的操作介面 ..................................................................... 37

4.2.1 建立資料庫 .................................................................................... 37

4.2.2 建立資料表.................................................................................... 37

4.2.3 使用者管理 .................................................................................... 42

4.3 管理指令介紹 ....................................................................................... 44

4.3.1 利用 mysqladmin 設定 root 的密碼................................................ 44

4.3.2 連線 MySQL................................................................................. 45

4.3.3 建立資料庫.................................................................................... 45

4.3.4 建立資料表.................................................................................... 46

第五章第五章第五章第五章 實用範例實用範例實用範例實用範例 ........................................................................................... 48

5.1 任務一:WEB BASE 客戶通訊錄 ........................................................... 48

5.1.1 Web Base 客戶通訊錄架構 ............................................................ 48

5.1.2 Web Base 通訊錄測試 ................................................................... 49

5.1.3 程式內容及說明 ............................................................................ 51

5.2 任務二:WEB BASE 群組軟體 ( TWIG ).................................................. 57

第六章第六章第六章第六章 維護及更新程序維護及更新程序維護及更新程序維護及更新程序................................................................................. 62

6.1 日常維護.............................................................................................. 62

2

6.2 更新程序.............................................................................................. 62

6.3 備份重要檔案....................................................................................... 62

6.4 離線備份與還原 ................................................................................... 62

6.4.1 離線備份 ....................................................................................... 62

6.4.2 離線還原 ....................................................................................... 63

6.5 線上備份與還原 ................................................................................... 63

6.5.1 線上備份 ....................................................................................... 63

6.5.2 線上還原 ....................................................................................... 64

第七章第七章第七章第七章 問題與解答問題與解答問題與解答問題與解答 ........................................................................................ 66

第八章第八章第八章第八章 參考資料參考資料參考資料參考資料 ........................................................................................... 76

附錄一附錄一附錄一附錄一、、、、 SQL COMMAND 介紹介紹介紹介紹 .................................................................. 78

附錄二附錄二附錄二附錄二、、、、REPLICATION ................................................................................ 89

3

第一章第一章第一章第一章 簡介簡介簡介簡介

MySQL 是一種: 跨平台,多使用者,多執行緒,支援 SQL 語言 (結構化

查詢語言),執行速度快,廣受全球網站大量採用的網路資料庫系統,最重要的

是,在大部份情形下,使用 MySQL 是完全免費的!( MySQL 自 3.23.19 之後

已改為 GPL 版權宣告囉!)。整體而言,MySQL 免費,原始碼開放,入門容易,

執行速度快,跨平台 (亦支援 Windows 2000),支援工具眾多等特性,十分適

合中小企業用來開發各種資訊系統!企業不必再花費數十萬元,去購買一些費而

不惠的資料庫!

MySQL 沒有所謂連線使用者限制,其它商用資料庫系統,一定數量以上的

連線使用者數,可是要付出相當可觀的費用的!像 Yahoo 等大公司,也是用

MySQL 哩! 連這麼大的入口網站都安心地挑選 MySQL ,一般的中小企業更

無需擔心 MySQL 的穩定性。

1.1 適用對象適用對象適用對象適用對象 (Audience)

本 SOP 的對象適合一般的使用者及系統管理者.編排的方式大部分皆採操

作步驟的模式進行,方便一般入門的使用者.

1.2 MySQL 本身本身本身本身

在 Unix 平台上,最受到歡迎的一套資料庫系統就是 MySQL, MySQL 於

1990 中期開始發展,當時,Michael Mothnty Widenius 在位於瑞典的 TcX

DataKonsultAB 開始開發這套軟體並在 1995 年公開釋放第一個版本。

MySQL 同時擁有頗為可觀跨平台能力,它能 Unix Like 平台工作例如 AIX、

Solaris、FreeBSD 及 Linux,也能在 Mac OS X 及 Windows NT/2000 server 亦

或是 Microsoft Wrokstation 系統上如 9x/ME/XP 上開發程式,更重要的是它是

讓您擁有原始碼。

在 MySQL 在 3.23 之後的版本,在每個系統元件上在釋放時都會加上一個

完成度的註解如由「gamma」階段到「stale」階段,「beat」階段到「alpha」

階段,階段愈低愈不穩定,查詢目前的發展版本可以在 MySQL 參考手冊及線上

文件找到。

4

MySQL 經過考驗證明是值得信賴的資料庫系統,如果您是 stable 版的使用

者,您大可以放心,MySQL 對於版本的控制是十分注意,並提供廣大的使用者

原始碼下載,Bug 也因此很快就被解決。

MySQL 主要是以技術支援和經銷資料庫為主,和 Red Hat 在 Linux 上的做

法非常類似,背後則是由創投資金在支持。客戶可以下載 MySQL,並遵照 GPL

授權規定使用,MySQL 公司則以技術服務作為收入。

MySQL 也提供付費的解決方案給想要整合 MySQL 和其他軟體產品,但是

又不想讓客戶取得程式碼的公司。MySQL 表示,MySQL 資料庫在全球已經有

400 萬的使用者,但是並不清楚其中有多少付費用戶。到目前為止,MySQL 也

已經引起企業用戶的興趣,甚至包括 Yahoo 和 Google 等網際網路的領導廠商。

MySQL 最原始的構想嚐試克服自由軟體資料庫系統「mSQL」的一些功能

上的限制,MySQL 成長進步的非常的快,尤其當贊助者由網際網路應用中看出

MySQL 能提供網站所需強健資料庫的潛能,對於 MySQL 成長的速度幫助不少。

而近來更有令人振奮的好消息。( 2003 年 5 月 )

ERP 的龍頭 SAP 正在與 MySQL 就開放源代碼資料庫軟體進行合作。這項

交易將會使得 MySQL 這樣更小的公司能夠加速它的開發計畫。此舉將允許

MySQL 公司在未來的兩年內為其資料庫軟體添加更高端的一些特徵。MySQL

公司的首席執行官 Marten Mickos 說,公司早在四年前就希望能夠進軍高端資料

庫業務。這次交易在資料庫市場上還引起了另外一些影響。它給那些開發資料庫

業務的公司帶來了不少壓力,譬如微軟,甲骨文以及 IBM 等。因為這項交易為

這些公司不斷樹立了一個越來越強大的開放源代碼軟體的競爭者,而開放源代碼

軟體最終也許會吞噬它們的資料庫市場。

SAP 公司一直是銷售那些管理核心業務的一些軟體,譬如會計軟體,存貨

管理軟體,這些產品以前一直是各大公司的暢銷軟體。為了吸引那些中等規模的

公司客戶從而進行業務擴張,這家德國的公司開始在他們的一些產品中加入SAP

DB,這是一個開放源代碼的資料庫軟體。該軟體就可以免除 SAP 公司客戶花額

外的錢用在第三方的資料庫產品上,譬如就可以不用再購買甲骨文公司的資料庫

軟體。

根據他們的技術交錯式授權協議,MySQL 公司將會主宰 SAP DB 的絕大部

分再開發業務,並且 MySQL 也會使用該程式的設計作為該公司未來改進的資料

庫軟體的模型。SAP 公司的一位元代表稱,隨著 MySQL 資料庫軟體的不斷成

熟,SAP 公司將會用新的 MySQL 的資料庫軟體代替 SAP DB。Mickos 說,在

5

這項交易中,這家瑞典公司 MySQL 將會得到其軟體的版稅。但他拒絕透露這次

合作的一些經濟方面的細節。

SAP 的代表稱,在更長一段時間後,該開放源代碼資料庫軟體將會和 SAP

公司的旗艦產品 R/3 一起銷售。

不久之後,SAP 與 MySQL 將會完成他們合作計畫的第一個階段。那

就是 SAP 將會發佈一個 MySQL 的資料庫版本,從而它可以無縫地替代現在使

用的 SAP DB。這對 MySQL 而言無異是如虎添翼。想必在不久的將來,MySQL

定能擔任企業更重要的任務。

1.3 MySQL 4.0 版跟版跟版跟版跟 5.0 版重大的改進功能版重大的改進功能版重大的改進功能版重大的改進功能

以下是 4.0 版跟 5.0 版一些重大的改進功能:

MySQL 4.0 版 http://www.mysql.com/doc/en/News-4.0.x.html

內建提供 InnoDB table type,支援 standard binaries, adding

transactions, row-level locking, 和 foreign keys。

提昇 Query 速度。

改善 boolean mode, truncation, and phrase searching.全文檢索效

率。

加強 MERGE tables, 並支援 INSERT statements and

AUTO_INCREMENT. 在 SELECT 中支援 UNION 語法

支援 Multi-table DELETE statements.

libmysqld, the embedded server library. 更多的 GRANT 參數來加強安全性

提供更多動態參數來降低停止 MySQL 的必要。

改善 replication code and features.

改善執行效率並增加可靠性.

MySQL 5.0 版 http://www.mysql.com/doc/en/TODO_MySQL_5.0.html

改善執行效率並增加可靠性

提供 Stored Procedures 機制

支援 cursor

Dynamic length rows for HEAP tables

Add true VARCHAR support

6

加強執行效率

更好的國際語系支援

提供可用性

1.4 各家資料庫軟體比較各家資料庫軟體比較各家資料庫軟體比較各家資料庫軟體比較

目前市面上較被廣為使用資料庫除了 MySQL 之外尚有下列幾種:

1. MS SQL Server 2000

2. Oracle 8i

3. IBM DB2

4. Informix

過去幾年來,在總值 120 億美元的資料庫市場上,如果廠商想要誇讚自家的

產品,那就一定得要有強大的資料庫,支援最嚴苛的任務,才站得上檯面。不過

到了今天,似乎光是這樣並不夠,客戶除了要求足以負擔嚴苛的任務之外,還希

望擁有聰明又便宜的資料庫。

Meta Group 的分析師 Charlie Garry 表示 ( 2003 年 5 月),MySQL 的商業

模式是以開放原始碼為基礎,以便讓客戶盡快接受 MySQL。Garry 指出,MySQL

甚至適合用在甲骨文、IBM、微軟等大廠爭相搶食的企業資料中心。

Information Resources 的資訊長 Marshall Gibbs 就表示,他們沒有任何品

牌的偏好,只要「功能、效能、價格的最佳組合」, 由研究近兩年來資料庫客戶

愈來愈注重總體成本(圖 1-1)。

7

圖 1-1 資料庫優先性

整體擁有成本整體擁有成本整體擁有成本整體擁有成本::::

大致說來,MySQL 是免費的,MySQL 需要付費的規定只限於下列兩種情

形:

1. 以 Embedded 的方式使用 MySQL。

2. 使用 MySQL 的商業用途軟體。

且其授權費用一台 MySQL Pro License 只需美金 $440,比起其他任何資

料庫軟體來得容易負擔多了。加上其易於管理的特性,著實可大大降低企業資料

庫的整體擁有成本。

擴充性擴充性擴充性擴充性::::

MySQL 同時提供高度多樣性,能夠提供給很多不同的使用者介面,包括命

令列操作、網頁瀏覽器、以及各式各樣的程式語言介面,例如:Java、C++、

Perl、PHP 及 Phython。MySQL 可用 Unix、Windows 以及 OS/2…等平台,因

此它可以用個人電腦或是伺服器上。

性能性能性能性能::::

事實上,大部份的網站的開發者都認為 MySQL 是目前市面跑得最快的資料

8

庫。對資料庫的最佳化,主要在於你對他的設定和資料庫結構的設計,如果你的

資料庫結構設計得非常差,你的存取速度還是會受到影響而變得比較慢。

9

第二章第二章第二章第二章 前置需求前置需求前置需求前置需求

在安裝 MySQL 之前,請確定 Apache 及 MySQL 亦巳安裝,相關步驟請參考

Apache SOP 安裝 Apache 及 PHP 相關章節。

10

第三章第三章第三章第三章 安裝安裝安裝安裝

3.1 MySQL 安裝安裝安裝安裝

在 RedHat 9.0 上安裝 MySQL 是件很容易的事,因為 RedHat 9.0 提供了一

個很方便的 GUI 套件管理工具「redhat-config-packages」。各位只要把 RedHat

9.0 第一片光碟放入並以 root 的身份登入系統,鍵入 redhat-config-packages,

勾選「SQL 資料庫伺服器」即可,然後按「更新」,如果遇到任何相依性問題,

系統會提示您更換光碟片。 ( 圖 3-1 ~ 3-3 )

Step 1 執行執行執行執行 redhat-config-packes

圖 3-1

Step 2 選擇資料伺服器選擇資料伺服器選擇資料伺服器選擇資料伺服器

11

圖 3-2

Step 3 檢查是否安裝成功檢查是否安裝成功檢查是否安裝成功檢查是否安裝成功

待安裝後,您可以用利用「rpm -qa | grpe ^mysql」檢查是否安裝成功。

圖 3-3

啟動 MySQL ( Command Mode ):馬上啟動 MySQL 的指令為「service mysqld

start」,如果您希望一開機就自動啟動 MySQL 請執行「chkconfig mysqld on」。

12

圖 3-4

啟動啟動啟動啟動 MySQL ( WebMin 介面介面介面介面 )::::

我們也可以利用 WebMin 來啟動 MySQL,步驟如下:

Step 1 登入登入登入登入 Webmin

圖 3-5 登入 WebMin

Step 2 選擇伺服器選擇伺服器選擇伺服器選擇伺服器

13

圖 3-6 伺服器畫面

Step 2 選擇選擇選擇選擇 MySQL 資料庫伺服器資料庫伺服器資料庫伺服器資料庫伺服器

圖 3-7 伺服器畫面

14

Step 3 啟動啟動啟動啟動 MySQL 資料庫伺服器資料庫伺服器資料庫伺服器資料庫伺服器

圖 3-8 啟動 MySQL

更改資料庫管理者密碼更改資料庫管理者密碼更改資料庫管理者密碼更改資料庫管理者密碼

成功啟動 MySQL 後,因為資料庫管理者預設沒有密碼,建議使用前更改系

統管理者密碼,請輸入下列指令

# mysqladmin –u root –h cosa.example.com password ‘1234’

-u : 表示使用者帳號,root 為 MySQL 預設的管理帳號。

-h : 表示 MySQL 主機的主機名稱,也可使用 IP Address。

password : 表示使用者的密碼,因為字串,請使用單引號將密碼括起來。

圖 3-9 修改 MySQL 的密碼

15

3.2 phpMyAdmin 安裝安裝安裝安裝

本書除了會介紹利用當今 Linux 上最紅的整合管理工具 Webmin 來管理

MySQL 外,還會為各位介紹專門管理 MySQL 的工具 phpMyAdmin。

phpMyAdmin 是免費的 PHP 原始程式碼的 Web 網站,可用來管理整個

MySQL 伺服器,這是一套 Web 介面的 MySQL 管理程式,支援中文的使用者介

面。

phpMyAdmin 只需透過瀏覽器就可管理 MySQL 伺服器,換句話說,不論

MySQL 是安裝在 Linux 或是 Windows 作業系統,都可以使用相同步驟在

MySQL 上建立資料庫(Database)、資料表(Table)和編輯紀錄(Record)。

Step 1 下載 phpMyAdmin ( http://www.phpmyadmin.net ),選擇最櫎新穩定的

版本 2.5.3。

圖 3-10 http://www.phpmyadmin.net

16

圖 3-11 下載 phpMyAdmin-2.5.3-php.tar.bz2

Step 2 將 phpMyAdmin-2.5.3-php.tar.bz2 收至 /tmp ,並執行下列指令將其解壓

縮至/var/www。

# tar jxvf phpMyAdmin-2.5.3-php.tar.bz –C /var/www/html

圖 3-12 解壓縮安裝 phpMyadmin-2.5.3

Step 3 為了操作方便起見,建立 Soft link。

#ln –s phpMyAdmin-2.5.3 phpMyAdmin

圖 3-13 修改 phpMyadmin 設定檔 config.inc.php

17

Step 4 修改 phpMyadmin 設定檔 config.inc.php

# gedit /var/www/html/phpMyAdmin/config.inc.php

圖 3-14 config.inc.php 設定檔

Step 5 設定顯示行號以方便修改 config.inc.php 設定檔

18

圖 3-15 顯示行號

Step 6 修改下列設定

第 39 行 設定 phpMyAdmin 的 URL

第 69 行 MySQL Server 的 ip

第 80 行 利用何帳號存取 MySQL

第 81 行 如果 root 有設定 password,此處即填入 root 的 password

30 * In most cases you can leave this variable empty, as the correct value

31 * will be detected automatically. However, we recommend that you do

32 * test to see that the auto-detection code works in your system. A good

33 * test is to browse a table, then edit a row and save it. There will be

34 * an error message if phpMyAdmin cannot auto-detect the correct value.

35 *

36 * If the auto-detection code does work properly, you can set to TRUE the

37 * $cfg['PmaAbsoluteUri_DisableWarning'] variable below.

38 */

39 $cfg['PmaAbsoluteUri'] = 'http://ossc.cosa.org.tw/phpMyAdmin';

….

19

….

69 $cfg['Servers'][$i]['host'] = 'localhost'; // MySQL hostname or IP address

…..

80 $cfg['Servers'][$i]['user'] = 'root'; // MySQL user

81 $cfg['Servers'][$i]['password'] = '1234'; // MySQL password (only needed

圖 3-16 修改 config.inc.php

20

圖 3-17 修改 config.inc.php

圖 3-18 修改 config.inc.php p

Step 7 設定語系設定語系設定語系設定語系

21

圖 3-19 設定語系

圖 3-20 執行 phpMyAdmin

22

3.3 升級及注意事項升級及注意事項升級及注意事項升級及注意事項

RedHat 9.0 附的 MySQL 版本為 3.23, MySQL 所釋出最新穩定版本為

4.0。若是您不想用系統預附的 3.23,請先利用下列移除之前 3.23 的版本。

# rpm –e mysql-devel

# rpm –e mysql-server

# rpm –e mysql --nodeps

然後到下列網址下載您所想要的版本進行安裝,在這裏我們用 4.0.14 版為例

Step 1 下載相關套件下載相關套件下載相關套件下載相關套件( http://www.mysql.com/downloads/mysql-4.0.html )

圖 3-21 Download MySQL 4.0.14 相關 RPM

Step 2 利用利用利用利用 rpm 指令安裝指令安裝指令安裝指令安裝

23

圖 3-22 Install MySQL 4.0.14 相關 RPM

圖 3-23 Install MySQL 4.0.14 相關 RPM

Step 3 啟動啟動啟動啟動 MySQL

24

圖 3-24 啟動 MySQL 4.0.14 並修改密碼

25

第四章第四章第四章第四章 MySQL 管理管理管理管理

本章將我們介紹利用 Webmin、phpAdmin、Command 的方式建立一個名為

CONTACT 的資料庫,內有一個 address 的 Table,作為我們客戶通訊錄程式使

用的資料庫。

4.1 Webmin 管理介面管理介面管理介面管理介面

4.1.2 建立資料庫建立資料庫建立資料庫建立資料庫

Step 1 登入 Webmin

圖 4-1 登入 WebMin

Step 2 點選伺服器

26

圖 4-2 伺服器畫面

Step 3 點選 MySQL 資料庫伺服器

圖 4-3 MySQL 資料庫伺服器

27

Step 4 建立一個新的資料庫

圖 4-4 建立 MySQL 資料庫

Step 5 建立名為 CONTACT 的資料庫

28

圖 4-5 指定資料庫名稱

4.1.2 建立資料表建立資料表建立資料表建立資料表

假設我們要建立一個名為 address 的 Table,其結構如下:

欄位名稱 資料型態 長度 說明

id INT (自動編號) 連絡人編號

name varchar/文字 20 連絡人姓名

tel Varchar/文字 15 連絡人電話

Step 1 選擇 CONTACT 資料庫

29

圖 4-6 選擇資料庫

Step 2 指定欄位數目指定欄位數目指定欄位數目指定欄位數目

30

圖 4-7 設定欄位數目

Step 3 設定表格欄位屬性設定表格欄位屬性設定表格欄位屬性設定表格欄位屬性

圖 3-8 設定表格欄位屬性

Step 4 建立表格資料建立表格資料建立表格資料建立表格資料

31

圖 4-9 建立表格資料

圖 4-10 檢視資料

32

圖 4-11 新增資料

圖 4-12

33

圖 4-13

4.1.3 使用者管理使用者管理使用者管理使用者管理

接下來我們要利用 Webmin 來建立資料庫使用者並給予某些權限。

Step1 建立使用者建立使用者建立使用者建立使用者

34

圖 4-14 選擇使用者權限

圖 4-15

35

Step2 賦予權限賦予權限賦予權限賦予權限

圖 4-16

Step3 權限列表權限列表權限列表權限列表

36

圖 4-17

37

4.2 phpMyAdmin 的的的的操作介面操作介面操作介面操作介面

4.2.1 建立資料庫建立資料庫建立資料庫建立資料庫

Step 填入資料庫名稱並按填入資料庫名稱並按填入資料庫名稱並按填入資料庫名稱並按「「「「建立建立建立建立」」」」

圖 4-18 建立資料庫

4.2.2 建立資料表建立資料表建立資料表建立資料表

Step1 填入資料表名稱並指定欄位數量填入資料表名稱並指定欄位數量填入資料表名稱並指定欄位數量填入資料表名稱並指定欄位數量 執行執行執行執行

38

圖 4-19 填入資料表名稱並指定欄位數量

Step2 設定欄位屬性設定欄位屬性設定欄位屬性設定欄位屬性

圖 4-20 設定欄位屬性

39

Step3 phpMyAdmin 會產生相關的會產生相關的會產生相關的會產生相關的 SQL Command

圖 4-21 資料表結構及相關 SQL Command

Step4 新增新增新增新增 Record

40

圖 4-22

圖 4-23

41

圖 4-24

圖 4-25

42

4.2.3 使用者管理使用者管理使用者管理使用者管理

Step1 建立使用者建立使用者建立使用者建立使用者

圖 4-26

43

圖 4-27

Step2 給予權限給予權限給予權限給予權限

圖 4-28

Step3 權限列表權限列表權限列表權限列表

44

圖 4-29

4.3 管理指令介紹管理指令介紹管理指令介紹管理指令介紹

4.3.1 利用 mysqladmin 設定 root 的密碼

當您在 Windows 或 Linux 中安裝好 MySQL 後,系統會自動幫您建立兩個

帳,分別是 root 和 匿名者,MySQL 的 root 跟 Linux 最高權限使用者 root 無

關。MySQL 的 root 使用者相當於 MS SQL 中的 sa 帳號,擁有最高的 Database

管理權限,但系統預設 MySQL 的 root 是不需要密碼,所以通常我們一安裝

MySQL 後,首要任務便是修改 root 的密碼。

我們可以利用 mysqladmin 工具或是直接修改 MySQL 內部資料庫的使用者資

料。

# mysqladmin –u root –h cosa.example.com password ‘1234’

45

-u : 表示使用者帳號,root 為 MySQL 預設的管理帳號。

-h : 表示 MySQL 主機的主機名稱,也可使用 IP Address。

password : 表示使用者的密碼,因為字串,請使用單引號將密碼括起來。

密碼設定完成之後,還是可以利用 mysqladmin 修改密碼,但是你必須提供目前

的密碼

4.3.2 連線連線連線連線 MySQL

# mysql -uroot -p 密碼 (-p 和密碼之間不能有空白)

或 mysql -uroot -p (此方式,會在進入後要求密碼)

[root@ossc phpMyAdmin]# mysql -u root -p1234

Welcome to the MySQL monitor. Commands end with ; or \g.

Your MySQL connection id is 25 to server version: 3.23.54

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> show databases;

+----------+

| Database |

+----------+

| mysql |

| test |

+----------+

2 rows in set (0.00 sec)

mysql> exit

Bye

[root@ossc phpMyAdmin]#

4.3.3 建立資料庫建立資料庫建立資料庫建立資料庫

可利用 mysqladmin 指令建立 CONTACT 資料庫

# mysqladmin -u root -p1234 create CONTACT

46

或是利用 mysql 指令

[root@ossc bluepage]# mysql -u root -p1234

Welcome to the MySQL monitor. Commands end with ; or \g.

Your MySQL connection id is 1057 to server version: 3.23.54

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> create database CONTACT;

Query OK, 1 row affected (0.00 sec)

mysql> show databases;

+----------+

| Database |

+----------+

| CONTACT |

| address |

| hello |

| mysql |

| nuke |

| test |

+----------+

6 rows in set (0.00 sec)

mysql> exit

4.3.4 建立資料表建立資料表建立資料表建立資料表

編寫 adress.sql 內容如下:

-- Table structure for table 'address'

CREATE TABLE address (

id int(11) NOT NULL auto_increment,

name varchar(20) NOT NULL default '',

tel varchar(15) NOT NULL default '',

PRIMARY KEY (id)

) TYPE=MyISAM;

47

-- Dumping data for table 'address'

INSERT INTO address VALUES (1,'林小明','0800016888');

INSERT INTO address VALUES (2,'黃大雄','0800016888');

INSERT INTO address VALUES (3,'劉小芬','0800024365');

然後執行此 sql script

mysql -u root -p1234 CONTACT < address.sql

或是利 mysql command

[root@ossc bluepage]# mysql -u root -p1234

Welcome to the MySQL monitor. Commands end with ; or \g.

Your MySQL connection id is 1090 to server version: 3.23.54

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> use CONTACT;

Database changed

Database changed

mysql> CREATE TABLE address (

-> id int(11) NOT NULL auto_increment,

-> name varchar(20) NOT NULL default '',

-> tel varchar(15) NOT NULL default '',

-> PRIMARY KEY (id)

-> ) TYPE=MyISAM;

Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO address VALUES (1,'林小明林小明林小明林小明','0800016888');

Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO address VALUES (2,'黃大雄黃大雄黃大雄黃大雄','0800016888');

Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO address VALUES (3,'劉小芬劉小芬劉小芬劉小芬','0800024365');

Query OK, 1 row affected (0.00 sec)

mysql> exit

Bye

48

第五章第五章第五章第五章 實用範例實用範例實用範例實用範例

5.1 任務一任務一任務一任務一::::Web Base 客戶通訊錄客戶通訊錄客戶通訊錄客戶通訊錄

任職於開放科技公司的林小明,前些日子在最符合成本效益的條件下,快

速地完成公司網站的建置,老闆因此對小明讚譽有加。最近因為公司存放客戶資

料的 SQL Server 主機屢遭病毒攻擊加上作業系統本身的問題,當機次數頻繁。

老闆希望能儘快把公司的客戶通訊錄程式移轉到較穩定的環境上。因為此客戶通

訊錄程式最主要給內部人員使用,所以介面美觀並不特別要求,只求穩定且能快

速得到查詢結果。老闆希望在短時間先看到程式的雛型,並鍵入資料,對其效率

及穩定性進行測試。因為上次小明表現突出,所以這次不可能的任務自然又落到

小明身上。

小明想來想去,既然要快速又穩定,他而且又不希望所有人都得安裝 Client

程式,於是小明決定)捨棄他的舊愛「Delphi+MS SQL」,投向新歡「Apache +

MySQL + PHP」利用此架構來設計一個簡單實用的 Web Base 客戶通訊錄程式。

5.1.1 Web Base 客戶通訊錄架構客戶通訊錄架構客戶通訊錄架構客戶通訊錄架構

此程式需要建立 CONTACT 的資料庫,並建立 adress Tables,其結構如下表,

建立步驟請參考第三章。

欄位名稱 資料型態 長度 說明

id INT (自動編號) 連絡人編號

name varchar/文字 20 連絡人姓名

tel Varchar/文字 15 連絡人電話

Web Base 通訊錄共有下列幾個檔案,功能如下表:

檔案名稱 說明

Index.html Web Base 通訊錄首頁

add.php 新增連絡人的 php 程式

search.php 尋找連絡人的 php 程式

edit.php 具有更新及刪除功能的 php 程式

49

我們將這些檔案放至/var/www/html/bluepage (預設無 bluepage 目錄)

5.1.2 Web Base 通訊錄測試通訊錄測試通訊錄測試通訊錄測試

http://www.open.com/bluepage/

新增資料

圖 5-1 新增連絡人

圖 5-2 填入資料

50

圖 5-3 新增成功

搜尋及異動資料

圖 5-4 搜尋通訊錄

51

圖 5-5 編輯資料

圖 5-6 更新資料

5.1.3 程式內容及說明程式內容及說明程式內容及說明程式內容及說明

<!-- 程式範例程式範例程式範例程式範例::::index.html-->

<html> <head><title>通訊錄</title></head>

<body>

<center>

52

<h2>通訊錄</h2><hr>

<a href="index.html">通訊錄</a>

| <a href="add.php">新增連絡人</a>

| <a href="search.php">搜尋通訊錄</a>

</center>

</body>

</html>

<!-- 程式範例程式範例程式範例程式範例::::add.php -->

<html> <head><title>新增連絡人</title></head>

<body> <center><h2>新增連絡人</h2></center><hr>

<? // 取得欄位資料

if (isset($_POST["Name"]) && isset($_POST["Tel"]) ) {

$name = $_POST["Name"];

$tel = $_POST["Tel"]; // 檢查是否有輸入欄位資料

if ($name != "" && $tel != "") { // 建立 SQL 字串

$sql = "INSERT INTO address (name, tel) values('";

$sql.= $name."', '".$tel."')"; // 建立 MySQL 連結

$link = mysql_connect("localhost","root","1234"); // 選擇資料庫

mysql_select_db("CONTACT"); // 執行 SQL 指令

mysql_query($sql);

mysql_close($link); echo "<font color=red>新增連絡人成功!</font></br>";

}

}

?>

<form action="add.php" method="post">

<table border=0 width=300> <tr><td>姓名: </td>

53

<td><input type="text" name="Name"

size="20" maxlength="10"></td></tr> <tr><td>電話: </td>

<td><input type="text" name="Tel"

size="20" maxlength=20></td></tr>

<tr><td colspan=2 align="center"> <input type="submit" value="新增連絡人"></td></tr>

</table>

</form> <br><a href="index.html">通訊錄</a>

| <a href="add.php">新增連絡人</a>

| <a href="search.php">搜尋通訊錄</a>

</body>

</html>

<!-- 程式範例程式範例程式範例程式範例::::search.php -->

<html> <head><title>搜尋通訊錄</title></head>

<body> <center><h2>搜尋通訊錄</h2><hr>

<?

if (isset($_POST["Search"])) { // 建立資料庫連結並選定資料庫

$link = mysql_connect("localhost","root","1234");

mysql_select_db("CONTACT"); // 建立基本的 SQL 字串

$sql = "SELECT * FROM address "; // 檢查是否輸入姓名

if (chop($_POST["Name"]) != "" )

$name = "name LIKE '%".$_POST["Name"]."%' ";

else

$name = ""; // 檢查是否輸入電話號碼

if (chop($_POST["Tel"]) != "" )

$tel = "tel LIKE '%".$_POST["Tel"]."%' ";

else

$tel = "";

54

// if 條件組合 SQL 字串

if (chop($name) != "" && chop($tel) != "" )

$sql.= "WHERE ".$name." AND ".$tel; elseif (chop($name) != "" ) // 只有姓名

$sql .= "WHERE ".$name; elseif (chop($tel) != "" ) // 只有電話號碼

$sql .= "WHERE ".$tel; $sql.= " ORDER BY name"; // 最後加上排序

$result = mysql_query($sql); // 取得欄位數

$total_fields = mysql_num_fields($result);

echo "<table border=1>"; echo "<tr><td>編號</td><td>姓名</td><td>電話</td><td colspan=2>功能

選項</td></tr>";

// 表格顯示查詢結果

while ($rows = mysql_fetch_array($result, MYSQL_NUM)) {

echo "<tr>";

for ($i = 0; $i < $total_fields; $i++)

echo "<td>".$rows[$i]."</td>";

echo "<td><a href='edit.php?action=edit&id="; echo $rows[0]."'><b>編輯</b></td>";

echo "<td><a href='edit.php?action=del&id="; echo $rows[0]."'><b>刪除</b></td>";

echo "</tr>";

}

echo "</table><hr>";

mysql_free_result($result);

mysql_close($link);

}

?>

</center>

<form action="search.php" method="post">

<table border=0 width=450> <tr><td>搜尋姓名: </td>

<td><input type="text" name="Name"

size=10 maxlength=20></td></tr> <tr><td>搜尋電話: </td>

<td><input type="text" name="Tel"

55

size="20" maxlength="20"></td></tr>

<tr><td colspan=2 align="center"> <input type="submit" name="Search" value="搜尋"></td></tr>

</table>

</form> <br><a href="index.html">通訊錄</a>

| <a href="add.php">新增連絡人</a>

| <a href="search.php">搜尋通訊錄</a>

</body>

</html>

<? ob_start(); ?>

<!-- 程式範例程式範例程式範例程式範例::::edit.php -->

<html> <head><title>編輯通訊錄</title></head>

<body>

<? // 取得 URL 參數

$id = $_GET["id"];

$action = $_GET["action"]; // 建立資料庫連結

$link = mysql_connect("localhost","root","1234"); mysql_select_db("CONTACT"); // 選擇資料庫

// 執行的操作

switch ($action) { case "update": // 更新

// 取得欄位資料

$name = $_POST["Name"];

$tel = $_POST["Tel"];

$sql = "UPDATE address SET name='".$name.

"', tel='".$tel."' WHERE id=".$id; mysql_query($sql); // 執行 SQL 指令

mysql_close($link); header("Location: search.php"); // 轉向到 serach.php

break; case "del": // 刪除

$sql = "DELETE FROM address WHERE id=".$id;

56

mysql_query($sql); // 執行 SQL 指令

mysql_close($link); header("Location: search.php"); // 轉向到 serach.php

break; case "edit": // 編輯

$sql = "SELECT * FROM address WHERE id=".$id; $result = mysql_query($sql); // 執行 SQL 指令

$row = mysql_fetch_row($result); // 取回記錄

$name = $row[1]; // 取得欄位 name

$tel = $row[2]; // 取得欄位 tel

mysql_close($link); // 顯示編輯表單

?> <center><h2>更新通訊錄</h2></center><hr>

<form action="edit.php?action=update&id=<? echo $id ?>"

method="post">

<table border=0 width=300> <tr><td>姓名: </td>

<td><input type="text" name="Name" size="20"

maxlength="10" value="<? echo $name ?>"></td></tr> <tr><td>電話 : </td>

<td><input type="text" name="Tel" size="20"

maxlength="20" value="<? echo $tel ?>"></td></tr>

<tr><td colspan=2 align="center"> <input type="submit" value="更新連絡人"></td></tr>

</table>

</form> <br><a href="index.html">通訊錄</a>

| <a href="add.php">新增連絡人</a>

| <a href="search.php">搜尋通訊錄</a>

<? break;

} ?>

</body>

</html>

57

5.2 任務二任務二任務二任務二::::Web Base 群組軟體群組軟體群組軟體群組軟體 ( twig )

順利完成 Web Base 客戶通訊錄程式,測試一段時間後,「Apache + MySQL

+ PHP」架構的穩定與快速巳深得老闆與公司所有同事的認同。隨著公司業績蒸

蒸日上,人員組織編罝愈來愈龐大,跨部門的會議愈來愈多,業務員每日排滿拜

訪客戶的行程,跟客戶的 Email 的往來也愈來愈頻繁。

愈來愈多部門的同事希望公司能建置一套群組軟體,提供 web mail 可讓業

務人員方便收發 mail,還有連絡人、議事日程、待辦工作、書簽等功能。讓整個

公司運作及個人時間管理更有效率。

老闆問小明對這些需求有什麼看法,小明認為如果這些功能完全由程式部

門開發,必定曠日費時而且耗費公司資源。小明在網路尋找是否有提供這些功能

的 Free Software,皇天不負苦心人。小明發現了 TWIG (The Web Information

Gateway) http://twig.screwdriver.net 這個群組軟體。它在 Web 上整合郵件、

新聞、聯絡人、議事日程、工作序、書簽等功能,非常符合公司的需求。

Step 1 :下載 twig-2.7.7.tar.gz

下載網址 :http://twig.screwdriver.net/download.php3

Step 2 : 解開 twig-2.7.7.tar.gz

# tar -xzvf twig-2.7.7.tar.gz

58

Step 3 : 執行安裝動作,安裝到 /var/www/html/twig 目錄。

# cd twig-2.7.7

# ./twig-install /var/www/html/twig

Step 4 : 建立 MySQL 資料庫(twig)及各資料表

#cd setup

#mysql -u root -p1234

mysql> create database twig ;

Query OK, 1 row affected (0.01 sec)

mysql> quit

#mysql -u root –p1234 twig< twig.table.mysql

Step 5 : 修改 config.inc.php3 參數設定

# vi /var/www/html/twig/config/config.inc.php3 $config["fromdomain"] = "open.com"; //網域

$config["language"] = "chinesebig5"; //中文訊息

$config["imap_port"] = "143/notls"

59

Step 6 : 修改連結 MySQL 的帳號、密碼

# vi /var/www/html/twig/config/dbconfig.inc.php3

$dbconfig["sqlusername"] = "root"; // username

$dbconfig["sqlpassword"] = "1234"; // password

Step 7 : 其他設定檔

vi /etc/httpd/conf/httpd.conf 加入 AddType application/x-httpd-php .php3

在 DirectoryIndex 最後加入 index.php3

DirectoryIndex index.html index.html.var index.php3 在 AddDefaultCharset ISO-8859-1 加上 #

#AddDefaultCharset ISO-8859-1

vi /etc/php.ini

register_globals = On

# service httpd restart

Step 8 : sendmail 設定

vi /etc/mail/sendmail.cf 在 264 行前面加上#並重新啟動 sendmail「「「「service

snedmail restart」」」」。

262 # SMTP daemon options

263

264 # O DaemonPortOptions=Port=smtp,Addr=127.0.0.1, Name=MTA

265

266 # SMTP client options

267 #O ClientPortOptions=Family=inet, Address=0.0

60

Step 9 : 檢查設定有無錯誤 http://主機名稱/twig/test.php3

61

Step 10 : 登入 twig ( http://主機名稱/twig)

62

第六章第六章第六章第六章 維護及更新程序維護及更新程序維護及更新程序維護及更新程序

6.1 日常維護日常維護日常維護日常維護

系統管理員最好定期以 root 身份登入,看看信件。在 RedHat Linux 中有

一支 logwatch 程式會定時去分析 log file,如果發現異常,便會發信給 root。除

此之外,筆者建議讀者平時就檢查 MySQL log file ( /var/log/mysqld.log)是否有

異常情形。

6.2 更新程序更新程序更新程序更新程序

讀者可至 http://rpmfind.net 尋找 MySQL 相關套件,至於升級的相關步驟請

參考 Linux OS SOP 第 5.4 節。

6.3 備份重要檔案備份重要檔案備份重要檔案備份重要檔案

預設 MySQL 的 DB 檔案是存在 /var/lib/mysql 內,以 DB 名稱為目錄,目錄

內就是該 DB 的所有資料,通常得定期備份,還有 MySQL 的設定檔 /etc/my.cnf

也別忘了一起備份。

6.4 離線備份與還原離線備份與還原離線備份與還原離線備份與還原

6.4.1 離線備份離線備份離線備份離線備份

預設 MySQL 的 DB 檔案是存在 /var/lib/mysql 內,以 DB 名稱為目錄,目錄內

就是該 DB 的所有資料,像 CRM 這個 DB,就是存在 /var/lib/mysql/CRM 內,

在備份前,因為怕資料尚未完全寫入磁碟,而且 MySQL 會 Lock 在使用的 DB

檔案,所以應該是要先把 MySQL 先 Shutdown 一下,整個備份的程序可以下像

下面的指令去完成:

# cd /var/lib/mysql

63

# service mysqld stop

# tar cvfz CRM_db_20030905.tgz CRM

# service mysqld start

對!這樣就可以了! 不過要注意的是,怕 DB 內每個 Tables 間的資料有關關

聯性,所以最好是把整個 DB 一次備起來,單獨只備哪個 Tables 的檔案,以後回

存時,怕會有資料關聯不一致的問題!

6.4.2 離線還原離線還原離線還原離線還原

DB 發生錯誤而要回存時,其實也不難,先找出最近一次完整正常的備份,先把

現在錯誤的網頁或 DB 先更名或 tar 起來,再把好的備份給解開回原來目錄位

置就行了,需要注意的是, MySQL 服務最好也是要先停止,回存完成後再啟動服

務,回存 DB 的整個程序可能像下面:

# cd /var/lib/mysql

# service mysqld.stop

# mv CRM CRM_OLD

# tar xvfz CRM_db_20030905.tg

# service mysqld start

6.5 線上備份與還原線上備份與還原線上備份與還原線上備份與還原

6.5.1 線上備份線上備份線上備份線上備份

使用像上面的"檔案"方式備份是個不錯的方法,它最少可以保持該主機某個時

間點的完整檔案備份,但還是有一些問題需要考慮到,有些主機就不只建立一個

DB 而已,總不能為了備份某個 DB 而把整個 MySQL 服務停止,備份檔案的方

式,回存在原主機上一定適用,但假如 MySQL 版本升級,或是在那天,該網頁空間

需遷機移機到別的主機時,那就沒人敢保證備出來的資料檔可以用,所以我們可以

考慮另一種備份的方式,是使用 MySQL 本身提供的功能: "MySQL Data Dump",

指令是 "mysqldump".

64

使用 MySQL 的 Dump 功能可以把 DB 的"結構","資料"或"結構加資料"

Dump 成文字檔, mysqldump 指令提供的彈性很大,你可以選擇把整個 DB

Dump 成一個檔或是每個 Table 為一個檔,甚至是把結構檔和資料分開儲存都

可以.

# mysqladmin -uroot -p flush-logs

# mysqldump CRM -uroot -p --opt > CRM_20030905.sql # (CRM 是 DB 名稱, opt 是一個使用完整 Dump 參數)

假如只是要單獨 Dump 某個 Table 時,只要在上面的指令後,轉出符號 ">" 前

加個 Table 名稱就可以,如只要 phpbb2_users 這個 Table 的 Dump 時,只要

下:

# mysqldump CRM -uroot -p --opt CUSTOMER >

CRM_CUSTOMER_20030905.sql

6.5.2 線上還原線上還原線上還原線上還原

若要回存整個資料庫,只需將壓縮的備份檔還原成 Dump 的檔案,再用下面的

指令回存:

mysql CRM -uroot -p < CRM_20030905.sql

這邊需注意的是,若建立備份時是以"--opt"或"--add-drop-table"為參數時,回存

動作是先將舊的 Table 先刪除,重建 Table 的結構後再把 Data 匯入,所以回存

後,所有的資料會回到你當時備份那個時間點,因此在回存資料時,可以考慮把現

有錯誤或不完整的 DB 先備份一份下來,以備不時之需,或是拿來比對錯誤的地

方在那裡,當然你也可以把資料回存到另一個測試用的 DB 內,只要把上面指令

的 DB 名稱改成你的測試用 DB 名稱即可.

使用這種回存方式, MySQL 服務不需停止,也不會動到其他正在使用的 DB ,

在一些提供 MySQL 服務的虛擬主機,可用這種方式作你自己的 DB 備份及回

存.

65

另外,假如你是系統重建或是移機時,切需在新的 MySQL 內,新建一個空白

DB 後,才行作回存的工作,你可以用下面的指令建立:

mysql -uroot -p -e "CREATE DATABASE CRM" (上面的 CRM 是你要新建的 DB 名稱)

另一種作法,先用 "mysql" 指令進入 "mysql client console", 然後再用:

CREATE DATABASE CRM;

這樣就行了,記得尾端要加個 ";" 符號該行指令才會執行.

66

第七章第七章第七章第七章 問題與解答問題與解答問題與解答問題與解答

Q1::::RedHat 9.0 預附的預附的預附的預附的 MySQL 到底有無支援到底有無支援到底有無支援到底有無支援 Transcation 機制機制機制機制

Ans:

MySQL 自 3.23.34a 之後的 MySQL-Max 版本加入 InnoDB 的資料庫類型,透過

InnoDB,MySQL 同樣可以進行 COMMIT 與 ROLLRACK 的動作。RedHat 9.0

預附的 MySQL 為 3.23.54a-11,巳支援 InnoDB 的資料庫類型,不過必須做以

下設定:

1.cp /usr/share/doc/mysql-server-3.23.54a/my-medium.cnf to /etc/my.cnf

2. vi /etc/my.cnf 將以下設定前的#拿掉

innodb_data_home_dir = /var/lib/mysql/

innodb_data_file_path = ibdata1:10M:autoextend

innodb_log_group_home_dir = /var/lib/mysql/

innodb_log_arch_dir = /var/lib/mysql/

3.service mysqld restart

如此一來,各位在建立Table時,便可指定Table Type為 innodb ( ex. create table

with type=innodb )

Q2::::如何解決如何解決如何解決如何解決 php+mysql 許功蓋等字變亂的問題許功蓋等字變亂的問題許功蓋等字變亂的問題許功蓋等字變亂的問題?

Ans:

方法一方法一方法一方法一

【【【【確定確定確定確定 MySQL 預設的字元集預設的字元集預設的字元集預設的字元集:】:】:】:】

1. 打開 WinMySQLadmin 管理畫面(在視窗右下角狀態列紅綠燈圖示中按滑鼠

右鍵,點選 Show me 選項)。

2. 點選管理畫面中 [Variables] 標籤選項,其中 character_set 變數就是您預設

字元集的變數,其預設是 latin1 字元集(我們要將他改回 big5),而

chatacters_set 變數則是 MySQL 可以支援哪些字元集。

【【【【修改預設字元集變數修改預設字元集變數修改預設字元集變數修改預設字元集變數 character_set:::: 】】】】

1. 請點選管理畫面中 [my.ini Setup] 標籤選項,設定 my.ini。

2. 按一下 [Pick-up and Edit my.ini values] 按鈕,以便編輯目前的 my.ini 設定。

3. 在 [mysqld] 設定區塊底下新增一行 default-character-set = big5 變數設

67

4. 新增一個 [client] 設定區塊,並加入第三步驟的變數設定(游標往下移到空白

處,新增兩行 [client] 和 default-character-set=big5)。

5. 按一下畫面左下方 [Save Modification] 按鈕儲存設定。

6. 重新啟動 MySQL 或 Windows

方法二方法二方法二方法二

Server 端注意事項

php.ini 中,有關的設定為(預設值)

; Magic quotes for incoming GET/POST/Cookie data.

magic_quotes_gpc = On

; Use Sybase-style magic quotes (escape ' with '' instead of \').

magic_quotes_sybase = Off

Client 端注意事項

1.中文資料送進 mysql 前,請用 addslashes($str) 處理

2.處理後,送進 mysql 時,請用 '' 括起來,並在參數後留一個空白,如

$sql = "UPDATE ezf_table set tablename='$tname ',

tableend='$endtime', table inguser='$tguser ',

tableingid='$tguserid', tableallnumber='$tnumber', tableloca

l='$tablelocal', tableanyone='$tableopen', tabletext='$ttext ' WHERE

tableid='$t ableid'";

tablename='$tname ' c. 取出時,請用 stripslashes($str)

Q3::::MySQL root 密碼忘了密碼忘了密碼忘了密碼忘了,,,,該怎麼辦該怎麼辦該怎麼辦該怎麼辦?

Ans:

1.先停掉 mysql

# /etc/rc.d/init.d/mysql stop

2.以--skip-grant-table 的參數啟動 mysql

# safe_mysql --skip-grant-table&

3. 更改 root 密碼

# mysql mysql

mysql> UPDATE user SET password=password('newpassword')

68

WHERE user='root';

mysql> FLUSH PRIVILEGES;

mysql> exit

4.停掉 mysql 再重跑

# mysqladmin -uroot -p shutdown Enter password: //輸入新設定的密碼

# /etc/rc.d/init.d/mysql start

Q4::::NULL 值問題值問題值問題值問題

Ans::::

NULL 值的概念是造成 SQL 的新手的混淆的普遍原因,他們經常認為 NULL 是

和一個空字符串''的一樣的東西。不是這樣的!例如,下列語句是完全不同的:

mysql> INSERT INTO my_table (phone) VALUES (NULL);

mysql> INSERT INTO my_table (phone) VALUES ("");

兩個語句把值插入到 phone 列,但是第一個插入一個 NULL 值而第二個插入一

個空字符串。第一個的含義可以認為是“電話號碼不知道”,而第二個則可意味

著“她沒有電話”。

在 SQL 中,NULL 值在于任何其他值甚至 NULL 值比較時總是假的(FALSE)。

包含 NULL 的一個表達式總是產生一個 NULL 值,除非在包含在表達式中的運

算符和函數的文檔中指出。在下列例子,所有的列返回 NULL:

mysql> SELECT NULL,1+NULL,CONCAT('Invisible',NULL);

如果你想要尋找值是 NULL 的列,你不能使用=NULL 測試。下列語句不返回任

何行,因為對任何表達式,expr = NULL 是假的:

mysql> SELECT * FROM my_table WHERE phone = NULL;

要想尋找 NULL 值,你必須使用 IS NULL 測試。下例顯示如何找出 NULL 電話

號碼和空的電話號碼:

69

mysql> SELECT * FROM my_table WHERE phone IS NULL;

mysql> SELECT * FROM my_table WHERE phone = "";

在 MySQL 中,就像很多其他的 SQL 服務器一樣,你不能索引可以有 NULL 值

的列。你必須聲明這樣的列為 NOT NULL,而且,你不能插入 NULL 到索引的

列中。

當用 LOAD DATA INFILE 讀取數據時,空列用''更新。如果你想要在一個列中有

NULL 值,你應該在文本文件中使用\N。字面上的詞'NULL'也可以在某些情形下

使用。

當使用 ORDER BY 時,首先呈現 NULL 值。如果你用 DESC 以降序排序,NULL

值最後顯示。當使用 GROUP BY 時,所有的 NULL 值被認為是相等的。

為了有助于NULL的處理,你能使用 IS NULL和 IS NOT NULL運算符和 IFNULL()

函數。

對某些列類型,NULL 值被特殊地處理。如果你將 NULL 插入表的第一個

TIMESTAMP 列,則插入當前的日期和時間。如果你將 NULL 插入一個

AUTO_INCREMENT 列,則插入順序中的下一個數字。

Q5::::如何將圖片存放於如何將圖片存放於如何將圖片存放於如何將圖片存放於 MySQL 中中中中????

Ans::::

Step 1.建立資料庫建立資料庫建立資料庫建立資料庫 test

Step 2. 建立表格建立表格建立表格建立表格 binary_data

CREATE TABLE binary_data (

id INT(4) NOT NULL AUTO_INCREMENT PRIMARY KEY,

description CHAR(50),

bin_data LONGBLOB,

filename CHAR(50),

filesize CHAR(50),

filetype CHAR(50)

70

);

Step 3. 利用利用利用利用 store.php 寫入圖片寫入圖片寫入圖片寫入圖片

store.php 程式碼

<HTML>

<HEAD><TITLE>Store binary data into SQL Database</TITLE></HEAD>

<BODY>

<? // code that will be executed if the form has been submitted:

if ($submit) {

mysql_connect("localhost","root","YOUR_PASSWORD");

mysql_select_db("test");

$data=Base64_Encode(fread(fopen($form_data, "r"), filesize($form_data)));

$result=MYSQL_QUERY("INSERT INTO binary_data

(description,bin_data,filename,filesize,filetype) ".

"VALUES

('$form_description','$data','$form_data_name','$form_data_size','$form_data

_type')");

$id= mysql_insert_id();

print "<p>This file has the following Database ID: <b>$id</b>";

MYSQL_CLOSE();

} else {

// else show the form to submit new data:

?>

<form method="post" action="<?php echo $PHP_SELF; ?>"

enctype="multipart/form-data">

File Description:<br>

<input type="text" name="form_description" size="40">

<INPUT TYPE="hidden" name="MAX_FILE_SIZE" value="4000000">

<br>File to upload/store in database:<br>

<input type="file" name="form_data" size="40">

<p><input type="submit" name="submit" value="submit">

</form>

<?

}

71

?>

</BODY>

</HTML>

Step 3. 利用利用利用利用 store.php 取出圖片取出圖片取出圖片取出圖片

getdata.php 程式碼

<?

// Syntax: getdata.php3?id=<id>

if($id) {

// you may have to modify login information for your database server:

@MYSQL_CONNECT("localhost","root","YOUR_PASSWORD");

@mysql_select_db("test");

$query = "select bin_data,filetype from binary_data where id=$id";

$result = @MYSQL_QUERY($query);

$data = Base64_Decode(@MYSQL_RESULT($result,0,"bin_data"));

$type = @MYSQL_RESULT($result,0,"filetype");

Header( "Content-type: $type");

echo $data;

};

?>

Q6::::MySQL 裝好之後裝好之後裝好之後裝好之後,,,,啟動時啟動時啟動時啟動時,,,,或是執或是執或是執或是執行行行行 mysqladmin 會出現如下訊息會出現如下訊息會出現如下訊息會出現如下訊息::::

Can't connect to local MYSQL Server through Socket /var/lib/mysql/mysql.sock 或是或是或是或是

Can\'t connect to local MYSQL Server through Socket /tmp/mysqld.sock????

Ans:::: 可能有下列幾個原因:

1.這個 mysqld.sock 不見了!被某人刪除了,或是被一些系統自動執行程式給刪

了,例如有些 cron 任務便會設定定期刪除 tmp 裡的東西。所以呢,您只能修改

cron 裡的設定,讓它不要清除 mysqld.sock。

2.在啟動時,也可以改變 mysqld.sock 的位置。您在啟動 MySQL 的時候,可以

加入此參數:/usr/local/mysql/bin/safe_mysqld --user=mysql --socket=/其他路

徑/socket & 同時得去設定環境變數 MYSQL_UNIX_PORT 的值,以指定新的

72

路徑。

3.若是您沒改 MYSQL_UNIX_PORT 的值,那麼您可以在執行指令的時候才打,

例如:mysqladmin --socket=/其他路徑/socket version

Q7::::How to get the "last insert id"?

Ans::::

CREATE TABLE product (

id INT(4) NOT NULL AUTO_INCREMENT PRIMARY KEY,

description VARCHAR(50)

);

1.利用 SQL 的話

mysql> insert into product(description) values('123');

Query OK, 1 row affected (0.00 sec)

mysql> select last_insert_id();

+------------------+

| last_insert_id() |

+------------------+

+------------------+

1 row in set (0.00 sec)

======================================== 2.如果是 PHP 的話

你可以用"mysql_insert_id()"取得該 id

//PHP example....

$result=MYSQL_QUERY("INSERT INTO product (description) ".

"VALUES ('$description')");

$id= mysql_insert_id();

print "This file has the following Database ID: $id";

Q8::::如何將文字檔匯入資料庫如何將文字檔匯入資料庫如何將文字檔匯入資料庫如何將文字檔匯入資料庫

Ans::::

$addr="/home/httpd/html/php/school/001.txt";

$sql_select = "load data infile '$addr' into table test fields terminated by '\t' "; 解說:

$sql_select = "load data infile '文字檔名' into table 表格名 fields terminated by

73

'\t' ";

(欄位分隔以 TAB 鍵)

該文字檔須與資料表欄位格式相符

例如:欄位有三個

則文字檔為每行一筆資料,如下

欄 1 資料<TAB>欄 2 資料<TAB>欄 3 資料

欄 1 資料<TAB>欄 2 資料<TAB>欄 3 資料

欄 1 資料<TAB>欄 2 資料<TAB>欄 3 資料

欄 1 資料<TAB><TAB>欄 3 資料

Q9::::如何撰寫如何撰寫如何撰寫如何撰寫 MySQL C API

Ans::::

Step 1.利用文字編輯器撰寫以下程式碼利用文字編輯器撰寫以下程式碼利用文字編輯器撰寫以下程式碼利用文字編輯器撰寫以下程式碼 mysqlc.c

#include <stdio.h>

#include <mysql/mysql.h>

int main (int argc, char *argv[])

{

MYSQL mysql;

MYSQL_RES *res;

MYSQL_ROW row;

if (argc != 2)

{

fputs ("Usage: myc <database>", stderr);

return 1;

}

if (!(mysql_connect(&mysql,"localhost","root","Your_Password")))

{

fputs ("Error connecting", stderr);

abort();

}

74

if (mysql_select_db(&mysql,argv[1]))

{

fputs ("Error selecting database", stderr);

abort();

}

if (mysql_query(&mysql,"SELECT * FROM test_table"))

{

fputs ("Error processing query", stderr);

abort();

}

if (!(res = mysql_store_result(&mysql)))

{

fputs ("Error storing results", stderr);

abort();

}

while((row = mysql_fetch_row(res))) {

uint i = 0;

for (i=0 ; i < mysql_num_fields(res); i++)

printf("%s ",row[i]);

printf("\n");

}

return 0;

}

Step 2. Compile

#gcc -I/usr/local/mysql/include -L/usr/local/mysql/lib/mysql mysqlc.c –lm

-lmysqlclient

(其中 include path 與 library path 取決於你的 MySQL 安裝路徑)

75

如果執行時,發生如下 error

Run problem:error in loading shared libraries: libmysqlclient.so.X!

將你的 MySQL library path(for example:/usr/local/mysql/lib/mysql)

加入/etc/ld.so.conf, and run /sbin/ldconfig -v

Q9::::ASP + MySQL 範例程式範例程式範例程式範例程式

Ans::::

Dim myconn As New ADODB.Connection

Dim myrs As New Recordset

Dim mySQL As String

Dim myrows As Long

myconn.Open "DSN=MyODBCsample"

mySQL = "SELECT * from user"

myrs.Source = mySQL

Set myrs.ActiveConnection = myconn

myrs.CursorLocation = adUseClient

myrs.Open

myrows = myrs.RecordCount

myrs.Close

myconn.Close

可參考 http://www.dwam.net/mysql/asp_myodbc.asp 有詳細的資料

Q10::::如何將如何將如何將如何將 MySQL 中的資料庫匯出成中的資料庫匯出成中的資料庫匯出成中的資料庫匯出成.txt 檔檔檔檔????

Ans:

select * from TableName into outfile 'text.xls';

all result fields will seperate by tab.

76

第八章第八章第八章第八章 參考資料參考資料參考資料參考資料

英文部份英文部份英文部份英文部份

網址

1. http://www.mysql.com MySQL 網站,有第一手有關 MySQL 的資料

2. http://www.mysql.com/doc/en/Replication.html 有關 MySQL Replication 的文件

3. http://www.geocities.com/sqlhome/faq/store_blob.html 如何在 MySQL 存放 BLOB 的資料

4.http://www.sapdb.org/ 有關 SAP 跟 MySQL 相關合作的網站

書藉

1. Cooking with MySQL

Paul DuBois has selected sample recipes from the hundreds you'll find in his book, MySQL

Cookbook. In this third and final series of excerpts showcasing these recipes, learn how to

compute team standings, how to calculate the differences between successive... Dec. 26,

2002

2. Tips for Building Web Database Applications with PHP and MySQL by Hugh E. Williams, co-author of Web Database Applications with PHP & MySQL 04/04/2002

3. Managing and Using MySQL, 2nd Edition By Tim King, George Reese, Randy Jay Yarger

4. MySQL Cookbook By Paul DuBois,Publisher O'Reilly,Pub Date : October 2002

中文部份中文部份中文部份中文部份

77

1. http://linux.tnc.edu.tw/techdoc/mysql/mysql_doc/manual_toc.html MySQL 中文手冊

2. http://chensh.loxa.edu.tw/php/Z_1.php PHP+MySQ 程式研習設計網站

3. http://linux.tnc.edu.tw/techdoc/banic/down.html PHP 4 手冊

4. http://www.tnc.edu.tw/admin_zone.php 台南縣教育網網路中心,有很多 Linux 相關文件

5. http://dob.tnc.edu.tw/ 網站建置百寶箱,有很多 PHP, MySQL 相關範例程式

5. http://www.dbworld.com.tw/ 資料庫專家電子雜誌,介紹資料庫的重要觀念及名詞

78

附錄一附錄一附錄一附錄一、、、、 SQL Command 介紹介紹介紹介紹

SQL (讀音:"ess-que-el") 是一種結構查詢語法。SQL 使用於資料庫交流

傳遞。相容於 ANSI (American National Standards Institute), 是一套標準的關聯

式資料庫語言。 SQL 語言是執行更新或從資料系統獲取資料。一般常見的關聯

資料庫系統都有提供 SQL 如: Oracle, Sybase, Microsoft SQL Server, Access,

Ingres, 等。雖然大部份的資料庫都有提供 SQL 但也多提供了自已獨特的語

法,造成了不相容的情形。但標準、基本的語法是相通的,如"Select", "Insert",

"Update", "Delete", "Create", and "Drop" 每一個系統都有支援。

Table 相關相關相關相關 Command

Create Table

關聯式資料庫包含有很多元件,稱為資料表(tables)。 把資料或訊息放在資

料表中, 資料表是以不同的名稱做分別。資料表由欄、列所構成的二維陣列,

欄包含欄位名、資料型態 、及其他可判斷的資訊。列是由全部欄位構成一筆一

筆的紀錄。

create table 語法用在建立一個新的資料表。語法格式如下:

create table "tablename"

("column1" "data type",

"column2" "data type",

"column3" "data type");

Format of create table if you were to use optional constraints:

create table "tablename"

("column1" "data type" [constraint],

"column2" "data type" [constraint],

"column3" "data type" [constraint]);

[ ] = optional

Note: You may have as many columns as you'd like, and the constraints are

optional.

79

Example:

create table employee

(first varchar(15),

last varchar(20),

age number(3),

address varchar(30),

city varchar(20),

state varchar(20));

注意建立資料表格式要以括號把前後框住,而最後以;(分號)做結尾。

欄位名不要超過 30 個字元長,而且不要使用 sql 的關鍵字(如 where 、

select 等),而在後面接是型態的宣告(如字串、數字、日期格式等)

資料型態是來描述欄位的方式,如一個欄位"Last_Name", 是一個姓氏,可

以使用"varchar" (可變動長度字串) 資料型態。

以下是幾個常見的資料庫型態:

char(size) 固定長度字串。最長為 255 位元。

varchar(size) 變動長度字串,最大字元數以 size 來指定。

number(size) 數值格式,可以是整數也可以是小數,最大數字以 size 位數判

斷,未指定小數位數,由系統內定。

date 日期格式

number(size,d) 數值格式,最大數字以 size 位數判斷,d 為小數位數,整數位

數為 size-d 位。

有何限制?當資料表被建立,通常有一或數個欄位是要使用來做關聯的功

能。 例如:"unique" 限制(唯一值),兩筆記錄不可以相同的值。 "not null" (非

空值),該欄位一定要輸入資料,不可是空的。"primary key" (主鍵)是每一筆記

錄識別的主要方式。

Drop a table

drop table 刪除資料表(其中的資料也會一併刪除)

drop table "tablename"

Example:

80

drop table 和刪除全部資料是不同的。刪除全部資料,欄位名稱、資訊等還會

存在,但刪除資料表會把這一些也一併移除掉。

如何查詢資料如何查詢資料如何查詢資料如何查詢資料

Select 基本用法基本用法基本用法基本用法

select 語法是關連式資料庫最常用的部份,可以取得你想要的資料。這是一個

簡單的範例:

select "column1"[,"column2",etc] from "tablename"

[where "condition"];

[] = optional

在 select 之後所列欄位名,則是要顯示的資料部份。你可以一一列出各欄位

名,或是以 "*" (星號)來代表選擇全部的欄位。

"from" 之後放資料表名稱。

"where" 子句 (選項) 指定要過濾的條件,符合者才會顯現。

where 可使用的條件運算元:

= 等於

> 大於

< 小於

>= 大或等於

<= 小或等於

<> 大相等

LIKE *相似

For example:

select first, last, city

81

from empinfo

where first LIKE 'Er%';

以'Er' 為開頭的字串就符合。要以單引號框住。

Or you can specify,

select first, last

from empinfo

where last LIKE '%s';

最後一字為 S 就符合。

select * from empinfo

where first = 'Eric';

則表示 first name 一定要是 'Eric' 才可以。

範例資料表"empinfo"

統計函數統計函數統計函數統計函數

MIN 傳回指定欄位最小值

MAX 傳回指定欄位最大值

SUM 傳回指定欄位總和

AVG 傳回指定欄位平均值

COUNT 傳回指定欄位的筆數

COUNT(*) 傳回資料庫中的總筆數

統計函數使用於資料表中的數值欄位配合 SELECT 語法使用。 只用於總結特

定單一欄位,可以配合 "GROUP BY" 做篩選,但也可以不使用 "GROUP BY"

語句。For example:

SELECT AVG(salary)

FROM employee;

82

傳回全部 salary 平均值

Another example:

SELECT AVG(salary)

FROM employee;

WHERE title = 'Programmer';

傳回 salary 平均值,條件為 employees 資料表中,當 title 等於

'Programmer'。

Example:

SELECT Count(*) FROM employees;

傳回 employees 資料表中紀錄總筆數。

GROUP BY 語法語法語法語法

SELECT column1, SUM(column2)

FROM "list-of-tables"

GROUP BY "column-list"; The GROUP BY 語句可以先以所列的欄位為條件分組排序在一起(可以多欄

位), example:

要列出每一個 dept 中最高 salary 值:

SELECT max(salary), dept

FROM employee

GROUP BY dept;

HAVING 語法語法語法語法

SELECT column1, SUM(column2)

FROM "list-of-tables"

GROUP BY "column-list"

HAVING "condition";

HAVING 子句是 GROUP BY 的一部份,用來過濾在 GROUP BY 所選出的資

料。功能如同 select 命令中 where 條件式一樣,只是 HAVING 必需配合

GROUP BY 使用。

我們以例子來說明。我們要取得每一公司名及每一公司的薪水平均值,輸入如下:

83

SELECT dept, avg(salary)

FROM employee

GROUP BY dept;

但如果我們只列出薪資平均值超過 20000 元的公司資料:

SELECT dept, avg(salary)

FROM employee

GROUP BY dept

HAVING avg(salary) > 20000;

ORDER BY 子句語法子句語法子句語法子句語法

SELECT column1, SUM(column2)

FROM "list-of-tables"

ORDER BY "column-list" [ASC | DESC];

[ ] =選項

ORDER BY 是一個選項子句,當你以排序方式來顯示資料(正向由小到大、反向

由大到小)以指定的欄位資料做排序。

ASC = 正向- 預設值

DESC = 反向排序

For example:

SELECT employee_id, dept, name, age, salary

FROM employee_info

WHERE dept = 'Sales'

ORDER BY salary;

以上列出公司代號、公司名、銷售員人名、年紀及薪資,而條件是公司名為

Sales ,顯示順序以薪資多少排序(由小到大,為預設值)

如果要以多個欄位做排序,要以逗號做分隔,如下:

SELECT employee_id, dept, name, age, salary

FROM employee_info

WHERE dept = 'Sales'

ORDER BY salary, age DESC;

84

結合條件及布林運算結合條件及布林運算結合條件及布林運算結合條件及布林運算

SELECT column1, SUM(column2)

FROM "list-of-tables"

WHERE "condition1" AND "condition2"; AND 運算可以結兩個或以上的條件放在 WHERE 子句中。 兩者都要為真,才

會顯示該筆記錄。

OR 運算,可以結兩個或以上敘述放在 WHERE 子句中。只要其中一個為直就

會顯示該筆記錄 。

For example:

SELECT employeeid, firstname, lastname, title, salary

FROM employee_info

WHERE salary >= 50000.00 AND title = 'Programmer'; 必需要薪資大於等於 50000,而且職稱為 Programmer,同時符合才會顯示該筆

資料。

以下以括號括住,雖然不是必需的,但如此比較容易讀。

SELECT employeeid, firstname, lastname, title, salary

FROM employee_info

WHERE (salary >= 50000.00) AND (title = 'Programmer'); 另外範例:

SELECT firstname, lastname, title, salary

FROM employee_info

WHERE (title = 'Sales') OR (title = 'Programmer'); 條件為只要是 'Sales' 或 'Programmer' 職稱的就會被列出。

IN and BETWEEN 子句子句子句子句

SELECT column1, SUM(column2) FROM "list-of-tables"

WHERE column3 IN (list-of-values);

SELECT column1, SUM(column2)

FROM "list-of-tables"

WHERE column3 BETWEEN value1 AND value2;

IN 子句使用在列舉項目的使用上,也就是分別測試是否符合所列的值。

For example:

85

SELECT employeeid, lastname, salary

FROM employee_info

WHERE lastname IN ('Hernandez', 'Jones', 'Roberts', 'Ruiz');

條件為姓氏(astname)要符合 Hernandez, Jones, Roberts, or Ruiz 其中一個,

才會被傳回。

IN 運算元也可以使用 OR 的語法來取代。如下結果相同。

SELECT employeeid, lastname, salary

FROM employee_info

WHERE lastname = 'Hernandez' OR lastname = 'Jones' OR lastname =

'Roberts' OR lastname = 'Ruiz';

但使用 IN ,句子比較短也比較易懂。

你也可以使用 NOT IN 來去掉不要的記錄。

BETWEEN 運算元,使用在判斷是否存在兩個數值之間。

For example:

SELECT employeeid, age, lastname, salary

FROM employee_info

WHERE age BETWEEN 30 AND 40;

傳回年紀 30 歲到 40 歲之間的資料(含 30 及 40 歲者)

相同的,也可以使用以下語法來達到相同的結果。

SELECT employeeid, age, lastname, salary

FROM employee_info

WHERE age >= 30 AND age <= 40;

你也可使用 NOT BETWEEN 來濾掉中間值的資料。

數學運算數學運算數學運算數學運算

標準 ANSI SQL-92 提供以下運算:

86

+ 加

- 減

* 乘

/ 除

% 餘數

餘數為除法後剩整數,這不在標準的 ANSI SQL 中,但大部份的資料庫都會支

援這運算元。以下列出有用的函數,雖不在 ANSI SQL-92 提供,但一般資料庫

也會支援他們。

ABS(x) 傳回 x 絕對值

SIGN(x) returns the sign of input x as -1, 0, or 1 (negative, zero, or

positive respectively)

MOD(x,y) 餘數 - returns the integer remainder of x divided by y (同

x%y)

FLOOR(x) 傳回小或等於 x 的最大整數值

CEILING(x) or

CEIL(x) 傳回大或等於 x 的最小整數值

POWER(x,y) x 的 y 次方

ROUND(x) 把 x 四捨五入為整數

ROUND(x,d) 四捨五入取到小數 d 位

SQRT(x) x 開平方

For example:

SELECT round(salary), firstname

FROM employee_info 傳回薪資取到整數位。

如何新增資料如何新增資料如何新增資料如何新增資料

insert 加入一筆新紀錄到資料表中

insert into "tablename"

(first_column,...last_column)

values (first_value,...last_value);

[] = optional

Example:

insert into employee

87

(first, last, age, address, city, state)

values ('Luke', 'Duke', 45, '2130 Boars Nest', 'Hazard Co', 'Georgia');

* Note: 字串要以單引號住,如:'string' ,數字框住也無妨。

insert into 後面接資料表名稱,再接以括號括住的欄位名,在 values 後括號

分別對映各欄位的值。

以上的例子新增了一筆:名(first) 為 'Luke',而住所(state) 為 'Georgia' 的資料

了。

如何刪除資料如何刪除資料如何刪除資料如何刪除資料

delete 可以刪除單筆或多筆紀錄。

delete from "tablename"

where "columnname" OPERATOR "value" [and|or "column" OPERATOR

"value"];

[ ] = optional

Examples:

delete from employee; Note: 如果你沒有指定 where 子句,那麼全部的紀錄都會被刪除。

delete from employee

where lastname = 'May';

delete from employee

where firstname = 'Mike' or firstname = 'Eric'; "delete from" 接著資料表名, 再接著是條件式判斷,沒有條件式,則全部紀錄會

被刪除。

如何更新資料如何更新資料如何更新資料如何更新資料

update 用來更新你所指定的記錄,要和 WHERE 配合小心使用。

語法:

update "tablename"

set "columnname" = "newvalue"[,"nextcolumn" = "newvalue2"...]

where "columnname" OPERATOR "value" [and|or "column" OPERATOR

"value"];

[] = optional

Examples:

88

update phone_book

set area_code = 623

where prefix = 979;

update phone_book

set last_name = 'Smith', prefix=555, suffix=9292

where last_name = 'Jones';

update employee

set age = age+1

where first_name='Mary' and last_name='Williams';

89

附錄二附錄二附錄二附錄二、、、、Replication

測試環境測試環境測試環境測試環境

RedHat 9.0 + MySQL 3.23.58 MySQL 資料庫路徑: /var/lib/mysql

MySQL 設定檔: /etc/my.cnf

Master IP: 192.168.0.100

Slave IP: 192.168.0.200

請至下列網址下載最新 MySQL 3.23.58 套件並利用 rpm –Uvh 更新

http://updates.redhat.com/9/en/os/i386/

圖 最新 MySQL 套件

測試架構圖測試架構圖測試架構圖測試架構圖

90

圖 測試架構圖

測試步驟測試步驟測試步驟測試步驟

Master server 部份部份部份部份

Step1: 確認 Master/Slave 機器上所裝的 MySQL 版本能進行

replication( 3.23.29 or higher )

Step2: 在 Master MySQL 上開放一個帳號給 Slave

#mysql –u root –p

mysql>GRANT FILE ON *.* TO [email protected] IDENTIFIED BY

‘abc123’;

mysql>\q

上面是 Master 開放一個帳號 repl 密碼 abc123 給 IP:192.168.0.200 有檔案處理

的權限.

Step3: shutdown MySQL on the Master

#mysqladmin –u root –p shutdown

Step4: 備份 Master 所有資料庫

#tar –cvf /tmp/mysql-snapshot.tar /var/lib/mysql 注意:tar 的時候,MySQL 是要在 stop 情況下

在 mysql (www.mysql.com) 網站的 FAQ 有不用 shutdown 的方法

192.168.0.100

192.168.0.200Master Server

Slave Server

91

Step5: 在 master 機器上修改/etc/my.cnf

在[mysqld]區段內加入參數

log-bin server-id=這邊設定 server-id=1

sql-bin-update-same binlog-do-db=CRM 只針對 CRM 資料庫做紀錄

Step6: Restart MySQL on the master

#service mysqld start 此時因為有加入 log-bin 參數,因此開始有 index 產生了,在/var/lib/mysql 目錄下

有.index 檔案紀錄資料庫的異動 log.

Slave server 部份部份部份部份

Step1: 在 slave 設定/etc/my.cnf

在[mysqld]區段加入

master-host=

master-user=

master-password=

master-port=

server-id= 這邊設定

master-host=192.168.0.100

master-user=repl

master-password=abc123

master-port=3306

server-id=2 master-connect-retry=60 預設重試間隔 60 秒

replicate-do-db=CRM 告訴 slave 只做 CRM 資料庫的更新

log-slave-updates

Step2: 將 master 上的 mysql-snapshot.tar copy 到 slave 上

用 ftp 傳到 slave 的/tmp

Step3 :解壓縮 Master 資料庫至 Slave Server 上

#cd /var/lib/

#tar xvf /tmp/mysql-snapshot.tar

#chown –R mysql:mysql mysql

92

#chmod –R 770 mysql (視情況)

Step4: Restart MySQL on the slave server 這時在/var/lib/mysql 目錄會出現 master.info,此檔案紀錄了 Master MySQL

server 的資訊.

狀況測試狀況測試狀況測試狀況測試

One-way replication

圖 One-way replication 架構圖

Step1: Master 跟 Slave 網路及服務都正常情況下,由 Master 端異動資料後,

到 Slave 端瀏覽資料,檢視是否有進行 replication?!

Step2: 模擬 Slave Server 當機

可用在於 slave 真的當機,或是 Slave 不一定需要一直跟 master connect。將

Slave MySQL server shutdown,由 Master 端異動資料,到 slave 端瀏覽,此時

Slave 應該沒有被 replication 更新,然後再將 Slave 端 MySQL server start 起來。

預設 60 秒後 Slave 會嘗試跟 Master 要求進行 replication.再去 Slave 端檢視是

否有更新資料?

192.168.0.100

192.168.0.200Master Server

Slave Server

93

Step3 :模擬 Master 當機,因為是設定 One-way replication.一旦 Master

Server, Slave 端沒有 Master 的 source 可以 download

Two-way replication 基於 Master 當機狀況於是發展雙向 Replication,即 192.168.0.100 ( Host A )/

192.168.0.200 ( Host B )都分別擔任 Master/Slave 身分。

圖 Two-way replication 架構圖

以下是針對兩台 MySQL 伺服器進行雙向 Replication

Step1:觀念同單向 replication 只是改成 Master 也有 Slave 身分, Slave 也有

Master 的身分,先分別在 Server A/Server B 都去 grant 一個進行 replication 的

身分。

[A]mysql>GRANT FILE ON *.* TO [email protected] IDENTIFIED BY

‘abc123’;

[B]mysql> GRANT FILE ON *.* TO [email protected] IDENTIFIED BY

‘abc123’;

Step2:做完單向 replication 後,stop Server A/server B MySQL service,此時 A/B

資料是一樣的。

192.168.0.100

192.168.0.200Server A

Master/Slave Server

Server B

Master/Slave Server

94

修改/etc/my.cnf 設定

範例:

Server A

[mysqld]

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

server-id=1

log-bin

sql-bin-update-same

binlog-do-db=CRM

master-host=192.168.0.200

master-user=repl

master-password=abc123

log-slave-updates

master-connect-retry=60

replicate-do-db=CRM

Server B

[mysqld]

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

server-id=2

log-bin

sql-bin-update-same

binlog-do-db=CRM

master-host=192.168.0.100

master-user=repl

master-password=abc123

log-slave-updates

master-connect-retry=60

replicate-do-db=CRM

分別 start Server A/Server B MySQL 後,此時雙方都是 Master/Slave 身分,一旦

哪一方資料異動就會通知對方來 replication。-若 replication 失效,則必須將

Server A/Server B 的 master.info 及.index,.00x 都砍掉,然後分別 restart MySQL

server,進行測試.檢視成果。

實務上,通常如果需要做 Two-way replication,通常會搭配 Virtual Server 使用,

95

在前端架設一台 Virtual Server,不過此部份不在此份 SOP 討論範圍內,有興趣

的讀者可參考 http://www.linuxvirtualserver.org/ 網站。

圖 Virtual Server + Two-way replication 架構圖

192.168.0.100 192.168.0.200

Host A

Master/Slave Server

Host B

Master/Slave Server

Virtual Host

96

圖 High Availability Linux Virtual Server 架構圖

97