<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>SpaLinux.com &#187; Database</title>
	<atom:link href="http://spalinux.com/category/database/feed" rel="self" type="application/rss+xml" />
	<link>http://spalinux.com</link>
	<description>Resources for Relaxing Linux System Administrators</description>
	<lastBuildDate>Sat, 21 Jan 2012 16:07:59 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>หัดใช้ PostgreSQL</title>
		<link>http://spalinux.com/2011/01/learn_to_use_postgresql</link>
		<comments>http://spalinux.com/2011/01/learn_to_use_postgresql#comments</comments>
		<pubDate>Sun, 30 Jan 2011 13:31:00 +0000</pubDate>
		<dc:creator>editor</dc:creator>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[PostgreSQL]]></category>

		<guid isPermaLink="false">http://spalinux.com/?p=1249</guid>
		<description><![CDATA[ช่วงนี้เหตุจำเป็นต้องใช้ฐานข้อมูล PostgreSQL  เลยลองติดตั้ง และหัดใช้กันซะหน่อย เห็นว่าน่าจะมีประโยชน์จึงมาเผยแพร่ให้อ่านกัน เนื่องจากคุ้นเคยกับ MySQL มานาน ในแต่ละหัวข้อจะเปรียบเทียบกับคำสั่ง mysql กรุณาสังเกต prompt ที่รันคำสั่ง จะมีอยู่ 2 โหมด คือ UNIX shell และ postgres ที่เข้าได้ด้วยคำสั่ง psql ติดตั้ง postgresql จากไฟล์ rpm บทความนี้ทดสอบบน Fedora 14 ติดตั้งจากไฟล์ rpm ที่อยู่ในแผ่นติดตั้ง Fedora 14 [root@fc14-64a ~]# mount /dev/cdrom /media mount: block device /dev/sr0 is write-protected, mounting read-only ไฟล์ที่ต้องติดตั้งมี 3 ไฟล์ ดังนี้ [root@fc14-64a ~]# cd [...]]]></description>
			<content:encoded><![CDATA[<p>ช่วงนี้เหตุจำเป็นต้องใช้ฐานข้อมูล PostgreSQL  เลยลองติดตั้ง และหัดใช้กันซะหน่อย เห็นว่าน่าจะมีประโยชน์จึงมาเผยแพร่ให้อ่านกัน</p>
<p>เนื่องจากคุ้นเคยกับ MySQL มานาน ในแต่ละหัวข้อจะเปรียบเทียบกับคำสั่ง mysql</p>
<p>กรุณาสังเกต prompt ที่รันคำสั่ง จะมีอยู่ 2 โหมด คือ UNIX shell และ postgres ที่เข้าได้ด้วยคำสั่ง psql</p>
<p><span id="more-1249"></span></p>
<h4>ติดตั้ง postgresql จากไฟล์ rpm</h4>
<p>บทความนี้ทดสอบบน Fedora 14</p>
<p>ติดตั้งจากไฟล์ rpm ที่อยู่ในแผ่นติดตั้ง Fedora 14</p>
<pre>[root@fc14-64a ~]# <strong>mount /dev/cdrom /media
</strong>mount: block device /dev/sr0 is write-protected, mounting read-only</pre>
<p>ไฟล์ที่ต้องติดตั้งมี 3 ไฟล์ ดังนี้</p>
<pre>[root@fc14-64a ~]# <strong>cd /media/Packages/
</strong>[root@fc14-64a Packages]# <strong>ls -l postgresql-*
</strong>-rw-r--r-- 6 root 101737 2804052 Oct  6 22:31 postgresql-8.4.5-1.fc14.x86_64.rpm
-rw-r--r-- 6 root 101737  197124 Oct  6 22:26 postgresql-libs-8.4.5-1.fc14.x86_64.rpm
-rw-r--r-- 6 root 101737 3409060 Oct  6 22:31 postgresql-server-8.4.5-1.fc14.x86_64.rpm</pre>
<p>ใช้คำสั่ง rpm เพื่อติดตั้ง</p>
<pre>[root@fc14-64a Packages]# <strong>rpm -i postgresql-libs-8.4.5-1.fc14.x86_64.rpm
</strong>[root@fc14-64a Packages]# <strong>rpm -i postgresql-8.4.5-1.fc14.x86_64.rpm
</strong>[root@fc14-64a Packages]# <strong>rpm -i postgresql-server-8.4.5-1.fc14.x86_64.rpm</strong></pre>
<pre>[root@fc14-64a ~]# <strong>umount /media</strong></pre>
<h4>รันเซอร์วิส postgresql (server)</h4>
<p>ใช้คำสั่ง service เพื่อรัน postgresql</p>
<pre>[root@fc14-64a ~]# <strong>service postgresql start</strong></pre>
<pre>/var/lib/pgsql/data is missing. Use "service postgresql initdb" to initialize the cluster first.
                                                           [<span style="color: #ff0000;">FAILED</span>]</pre>
<p>ไม่สามารถรันได้ เพราะยังไม่มีไฟล์ที่จำเป็นของฐานข้อมูล</p>
<pre>[root@fc14-64a ~]# ls -l /var/lib/pgsql/data/
total 0</pre>
<p>สร้างไฟล์ฐานข้อมูลเริ่มต้นด้วยคำสั่ง service initdb</p>
<pre>[root@fc14-64a ~]# <strong>service postgresql initdb
</strong>Initializing database:                                     [  OK  ]</pre>
<p>หลังจากรัน initdb จะมีไฟล์ถูกสร้างขึ้นในไดเรคทอรี /var/lib/pgsql/data/</p>
<pre>[root@fc14-64a ~]# <strong>ls -l /var/lib/pgsql/data/
</strong>total 36
drwx------ 5 postgres postgres    38 Jan 30 17:29 base
drwx------ 2 postgres postgres  4096 Jan 30 17:29 global
drwx------ 2 postgres postgres    17 Jan 30 17:29 pg_clog
-rw------- 1 postgres postgres  3411 Jan 30 17:29 pg_hba.conf
-rw------- 1 postgres postgres  1631 Jan 30 17:29 pg_ident.conf
drwx------ 2 postgres postgres     6 Jan 30 17:29 pg_log
drwx------ 4 postgres postgres    34 Jan 30 17:29 pg_multixact
drwx------ 2 postgres postgres     6 Jan 30 17:29 pg_stat_tmp
drwx------ 2 postgres postgres    17 Jan 30 17:29 pg_subtrans
drwx------ 2 postgres postgres     6 Jan 30 17:29 pg_tblspc
drwx------ 2 postgres postgres     6 Jan 30 17:29 pg_twophase
-rw------- 1 postgres postgres     4 Jan 30 17:29 PG_VERSION
drwx------ 3 postgres postgres    58 Jan 30 17:29 pg_xlog
-rw------- 1 postgres postgres 16867 Jan 30 17:29 postgresql.conf</pre>
<p>ใช้คำสั่ง service เพื่อรันเซอร์วิส postgresql อีกครั้ง</p>
<pre>[root@fc14-64a ~]# <strong>service postgresql start
</strong>Starting postgresql service:                               [  OK  ]</pre>
<p>ถึงตอนนี้เราก็ได้ postgresql server ไว้ลองใช้งานแล้ว ใช้คำสั่ง ps เพื่อดูโพรเซสของ postgresql</p>
<pre>[root@fc14-64a ~]# <strong>ps -ef | grep postgres
</strong>postgres  1101     1  2 17:29 ?        00:00:00 /usr/bin/postmaster -p 5432 -D /var/lib/pgsql/data
postgres  1103  1101  0 17:29 ?        00:00:00 postgres: logger process
postgres  1105  1101  0 17:29 ?        00:00:00 postgres: writer process
postgres  1106  1101  0 17:29 ?        00:00:00 postgres: wal writer process
postgres  1107  1101  0 17:29 ?        00:00:00 postgres: autovacuum launcher process
postgres  1108  1101  0 17:29 ?        00:00:00 postgres: stats collector process</pre>
<h4>คำสั่ง psql (client)</h4>
<p>ส่วนโปรแกรมฝั่ง client ต้องใช้คำสั่ง psql เพื่อติดต่อกับ postgresql server</p>
<p>ลองรันคำสั่ง psql ด้วย root จะขึ้น error ไม่สามารถเข้า database ได้</p>
<pre>[root@fc14-64a ~]# <strong>psql</strong>
psql: FATAL:  Ident authentication failed for user "root"</pre>
<p>ใช้คำสั่ง su เปลี่ยนเป็น postgres แล้วรันคำสั่ง psql อีกที จะเข้าโหมด client ได้</p>
<pre>[root@fc14-64a ~]# <strong>su - postgres</strong></pre>
<pre>-bash-4.1$ <strong>id</strong>
uid=26(postgres) gid=26(postgres) groups=26(postgres)</pre>
<pre>-bash-4.1$ <strong>psql
</strong>psql (8.4.5)
Type "help" for help.</pre>
<p>พิมพ์ &#8221;\h&#8221; หรือ help เพื่อดูวิธีการใช้งานเบื้องต้น  พิมพ์ &#8220;\q&#8221; เพื่อออกจาก postgres กลับสู่ shell</p>
<p>เครื่องหมาย prompt # แสดงถึงการเข้าด้วย database superuser</p>
<pre>postgres=# <strong>help</strong>
You are using psql, the command-line interface to PostgreSQL.
Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help with psql commands
       \g or terminate with semicolon to execute query
       \q to quit
postgres=# \q</pre>
<p>-bash-4.1$</p>
<h4>SHOW DATABASES</h4>
<p>ในโหมด postgres พิมพ์ &#8220;\l&#8221; หรือ &#8220;SELECT * FROM pg_database;&#8221; เพื่อแสดง database ที่มีอยู่ หรือ</p>
<pre>-bash-4.1$ <strong>psql
</strong>psql (8.4.5)
Type "help" for help.</pre>
<pre>postgres-# <strong>\l
</strong>                                  List of databases
   Name    |  Owner   | Encoding |  Collation  |    Ctype    |   Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres
                                                             : postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres
                                                             : postgres=CTc/postgres
(3 rows)
postgres=#</pre>
<pre>postgres=# <strong>SELECT * FROM pg_database;
</strong>  datname  | datdba | encoding | datcollate  |  datctype   | datistemplate | datallowconn | datconnlimit | datlastsysoid | datfrozenxid | dattablespace | datconfig |
datacl
-----------+--------+----------+-------------+-------------+---------------+--------------+--------------+---------------+--------------+---------------+-----------+---------------
----------------------
 template1 |     10 |        6 | en_US.UTF-8 | en_US.UTF-8 | t             | t            |           -1 |         11563 |          648 |          1663 |           | {=c/postgres,p
ostgres=CTc/postgres}
 template0 |     10 |        6 | en_US.UTF-8 | en_US.UTF-8 | t             | f            |           -1 |         11563 |          648 |          1663 |           | {=c/postgres,p
ostgres=CTc/postgres}
 postgres  |     10 |        6 | en_US.UTF-8 | en_US.UTF-8 | f             | t            |           -1 |         11563 |          648 |          1663 |           |
(3 rows)</pre>
<pre>postgres=#</pre>
<p> </p>
<h4>CREATE DATABASE</h4>
<p>การสร้าง database ใน postgresql ทำได้ด้วยคำสั่งบน shell คือ &#8220;createdb&#8221; ตามด้วยชื่อที่ต้องการสร้าง</p>
<p>ตัวอย่างเช่น ต้องการสร้างฐานข้อมูลชื่อ &#8220;testdb&#8221;</p>
<pre>-bash-4.1$ <strong>createdb testdb</strong></pre>
<p>แสดงชื่อฐานข้อมูลที่สร้าง</p>
<pre>-bash-4.1$ <strong>psql</strong>
psql (8.4.5)
Type "help" for help.</pre>
<pre>postgres=# <strong>\l
</strong>                                  List of databases
   Name    |  Owner   | Encoding |  Collation  |    Ctype    |   Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres
                                                             : postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres
                                                             : postgres=CTc/postgres
 <span style="color: #0000ff;">testdb    </span>| postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
(4 rows)</pre>
<h4>CREATE TABLE</h4>
<p>บน shell พิมพ์คำสั่ง psql ตามด้วยชื่อ database เพื่อเข้าสู่ชื่อฐานข้อมูล สังเกตว่า prompt จะขึ้นชื่อ database ที่ใช้อยู่</p>
<pre>-bash-4.1$ <strong>psql testdb
</strong>psql (8.4.5)
Type "help" for help.</pre>
<pre>testdb=#</pre>
<p>ทดลองสร้าง table ชื่อ weather  รูปแบบก็เป็นมาตรฐาน SQL ทั่วไป</p>
<pre>testdb=# <strong>CREATE TABLE weather (
</strong>testdb(#     <strong>city            varchar(80),
</strong>testdb(#     <strong>temp_lo         int,           -- low temperature
</strong>testdb(#     <strong>temp_hi         int,           -- high temperature
</strong>testdb(#     <strong>prcp            real,          -- precipitation
</strong>testdb(#     <strong>date            date
</strong>testdb(# <strong>);
</strong>CREATE TABLE
testdb=#</pre>
<p>พิมพ์ &#8220;\d&#8221; หรือ &#8220;SELECT * FROM pg_tables WHERE schemaname=&#8217;public&#8217;;&#8221; เพื่อแสดงชื่อ table ที่มีอยู่</p>
<pre>testdb=# <strong>\d
</strong>          List of relations
 Schema |  Name   | Type  |  Owner
--------+---------+-------+----------
 public | <span style="color: #0000ff;">weather</span> | table | postgres
(1 row)</pre>
<pre>testdb=# <strong>SELECT * FROM pg_tables WHERE schemaname='public';
</strong> schemaname | tablename | tableowner | tablespace | hasindexes | hasrules | hastriggers
------------+-----------+------------+------------+------------+----------+-------------
 public     | <span style="color: #0000ff;">weather</span>   | postgres   |            | f          | f        | f
(1 row)</pre>
<p>ลองใส่ข้อมูลเข้า table ด้วย คำสั่ง INSERT และดึงข้อมูลด้วยคำสั่ง SELECT</p>
<pre>testdb=# <strong>INSERT INTO weather VALUES ('San Francisco', 46, 50, 0.25, '1994-11-27');
</strong>INSERT 0 1</pre>
<pre>testdb=# <strong>SELECT * FROM weather;
</strong>     city      | temp_lo | temp_hi | prcp |    date
---------------+---------+---------+------+------------
 San Francisco |      46 |      50 | 0.25 | 1994-11-27
(1 row)</pre>
<h4>DROP TABLE</h4>
<p>ลบ table ด้วยคำสั่ง &#8220;DROP TABLE&#8221;</p>
<pre>testdb=# <strong>DROP TABLE weather;
</strong>DROP TABLE</pre>
<pre>testdb=# <strong>SELECT * FROM weather;
</strong>ERROR:  relation "weather" does not exist
LINE 1: SELECT * FROM weather;
                      ^
testdb=# <strong>\d
</strong>No relations found.</pre>
<h4>DROP DATABASE</h4>
<p>ลบ database ด้วยคำสั่ง shell &#8220;dropdb&#8221;</p>
<pre>-bash-4.1$ <strong>dropdb testdb</strong></pre>
<h4>ข้อมูลอ้างอิง</h4>
<ul>
<li><a href="http://www.postgresql.org/" target="_blank">PostgreSQL: Documentation</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://spalinux.com/2011/01/learn_to_use_postgresql/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>เปลี่ยน MySQL Prompt</title>
		<link>http://spalinux.com/2010/07/change_mysql_prompt</link>
		<comments>http://spalinux.com/2010/07/change_mysql_prompt#comments</comments>
		<pubDate>Fri, 02 Jul 2010 08:17:18 +0000</pubDate>
		<dc:creator>editor</dc:creator>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[mysql prompt]]></category>

		<guid isPermaLink="false">http://spalinux.com/?p=1115</guid>
		<description><![CDATA[เริ่มมีหลายฐานข้อมูลมากขึ้น เวลาใช้คำสั่ง mysql เพื่อจัดการฐานข้อมูลอาจงงๆ ว่าตอนนี้แก้ไขฐานข้อมูลใดอยู่ การเปลี่ยน prompt ในคำสั่ง mysql จะช่วยคุณได้ วิธีง่ายๆ คือตั้งค่าตัวแปรใน shell ที่ชื่อ MYSQL_PS1 ก่อนที่จะรันคำสั่ง ซึ่งวิธีการตั้งค่าจะแตกต่างกันในแต่ละ shell สำหรับ BASH shell ดีฟอลต์ของลีนุกซ์ส่วนใหญ่ทำได้โดย $ export MYSQL_PS1="\u@\d&#62; " $ mysql -u root -p Enter password: root@(none)&#62; root@(none)&#62; connect project1 root@project1&#62; สังเกตว่า prompt จะเปลี่ยนไปตามชื่อ user &#8220;\u&#8221; กับชื่อฐานข้อมูล &#8220;\d&#8221; ที่ใช้ หรือถ้าสามารถแก้ไขไฟล์ /etc/my.cnf ได้ ก็สามารถทำได้โดยเพิ่มคอนฟิก prompt ลงไปในส่วนที่คอนฟิกของ [mysql] [mysql] prompt="\u@\d&#62; [...]]]></description>
			<content:encoded><![CDATA[<p>เริ่มมีหลายฐานข้อมูลมากขึ้น เวลาใช้คำสั่ง mysql เพื่อจัดการฐานข้อมูลอาจงงๆ ว่าตอนนี้แก้ไขฐานข้อมูลใดอยู่ การเปลี่ยน prompt ในคำสั่ง mysql จะช่วยคุณได้</p>
<p><span id="more-1115"></span></p>
<p>วิธีง่ายๆ คือตั้งค่าตัวแปรใน shell ที่ชื่อ MYSQL_PS1 ก่อนที่จะรันคำสั่ง ซึ่งวิธีการตั้งค่าจะแตกต่างกันในแต่ละ shell สำหรับ BASH shell ดีฟอลต์ของลีนุกซ์ส่วนใหญ่ทำได้โดย</p>
<pre>$ <strong>export MYSQL_PS1="\u@\d&gt; "</strong></pre>
<pre>$ <strong>mysql -u root -p
</strong>Enter password:</pre>
<pre>root@(none)&gt;
root@(none)&gt; <strong>connect project1
</strong>root@project1&gt;</pre>
<p>สังเกตว่า prompt จะเปลี่ยนไปตามชื่อ user &#8220;\u&#8221; กับชื่อฐานข้อมูล &#8220;\d&#8221; ที่ใช้</p>
<p>หรือถ้าสามารถแก้ไขไฟล์ /etc/my.cnf ได้ ก็สามารถทำได้โดยเพิ่มคอนฟิก prompt ลงไปในส่วนที่คอนฟิกของ [mysql]</p>
<pre>[mysql]
prompt="\u@\d&gt; "</pre>
<p>มีค่าอื่นๆ ที่สามารถตั้งเป็น prompt ได้ ดูรายละเอียดเพิ่มเติมในส่วนข้อมูลอ้างอิง</p>
<h4>ข้อมูลอ้างอิง</h4>
<ul>
<li><a href="http://dev.mysql.com/doc/refman/5.1/en/mysql-commands.html" target="_blank">MySQL 5.1 Reference Manual :: mysql Commands</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://spalinux.com/2010/07/change_mysql_prompt/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>คอนฟิก MySQL Replication</title>
		<link>http://spalinux.com/2010/02/configure_mysql_replication</link>
		<comments>http://spalinux.com/2010/02/configure_mysql_replication#comments</comments>
		<pubDate>Fri, 26 Feb 2010 09:20:58 +0000</pubDate>
		<dc:creator>editor</dc:creator>
				<category><![CDATA[Backup]]></category>
		<category><![CDATA[Database]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[mysql replication]]></category>

		<guid isPermaLink="false">http://spalinux.com/?p=1084</guid>
		<description><![CDATA[บทความนี้จะอธิบายวิธีการคอนฟิก Replication ของ MySQL เพื่อทำการ replicate ข้อมูลในฐานข้อมูล (database) จากเครื่องหลัก (Master) ไปยังเครื่องสำรอง (Slave) ได้ หลังจากที่คอนฟิก Replication ถูกต้องเรียบร้อย เมื่อมีการเปลี่ยนแปลงข้อมูลในฐานข้อมูลบนเครื่องหลัก (Master) ไม่ว่าจะเป็นการ INSERT, UPDATE, DELETE หรือ แก้ไข table การเปลี่ยนแปลงนี้จะถูกส่งต่อ (replicate) ไปยังเครื่องสำรอง (Slave) โดยอัตโนมัติ การคอนฟิก Replication เป็นการป้องกันการเสียหาย ถ้าเครื่องหลักมีปัญหา ข้อมูลที่ถูกเก็บไว้ในเครื่องสำรอง ก็ยังสามารถใช้งานได้ ระบบทดสอบ ตัวอย่างในบทความนี้ จะทดสอบบนเครื่องสองเครื่องที่ติดตั้ง CentOS 5.4 และ MySQL 5.1.43 เรียบร้อยแล้ว เครื่อง Master ip: 192.168.1.1 hostname: centos54-a เครื่อง Slave ip: 192.168.1.2 [...]]]></description>
			<content:encoded><![CDATA[<p>บทความนี้จะอธิบายวิธีการคอนฟิก Replication ของ MySQL เพื่อทำการ replicate ข้อมูลในฐานข้อมูล (database) จากเครื่องหลัก (Master) ไปยังเครื่องสำรอง (Slave) ได้</p>
<p>หลังจากที่คอนฟิก Replication ถูกต้องเรียบร้อย เมื่อมีการเปลี่ยนแปลงข้อมูลในฐานข้อมูลบนเครื่องหลัก (Master) ไม่ว่าจะเป็นการ INSERT, UPDATE, DELETE หรือ แก้ไข table การเปลี่ยนแปลงนี้จะถูกส่งต่อ (replicate) ไปยังเครื่องสำรอง (Slave) โดยอัตโนมัติ</p>
<p>การคอนฟิก Replication เป็นการป้องกันการเสียหาย ถ้าเครื่องหลักมีปัญหา ข้อมูลที่ถูกเก็บไว้ในเครื่องสำรอง ก็ยังสามารถใช้งานได้</p>
<p><span id="more-1084"></span></p>
<h4>ระบบทดสอบ</h4>
<p>ตัวอย่างในบทความนี้ จะทดสอบบนเครื่องสองเครื่องที่ติดตั้ง CentOS 5.4 และ MySQL 5.1.43 เรียบร้อยแล้ว</p>
<p>เครื่อง <strong>Master</strong></p>
<ul>
<li>ip: 192.168.1.1</li>
<li>hostname: centos54-a</li>
</ul>
<p>เครื่อง <strong>Slave</strong></p>
<ul>
<li>ip: 192.168.1.2</li>
<li>hostname: centos54-b</li>
</ul>
<p>ตัวอย่างการใช้คำสั่ง rpm เพื่อตรวจสอบเวอร์ชั่นของ MySQL ที่ติดตั้ง</p>
<pre>[root@centos54-a ~]# <strong>rpm -qa | grep -i mysql
</strong>MySQL-server-community-5.1.43-1.rhel5
MySQL-client-community-5.1.43-1.rhel5
MySQL-shared-compat-5.1.43-1.rhel5</pre>
<p>หมายเหตุ</p>
<ul>
<li>MySQL 5.1.43 ที่ทดสอบนี้ ใช้เวอร์ชั่นที่ดาวน์โหลดจาก <a href="http://dev.mysql.com">http://dev.mysql.com</a></li>
<li>แนะนำให้ใช้ MySQL เวอร์ชั่นเดียวกันบนเครื่อง Master และ Slave</li>
</ul>
<h4>เครื่อง Master &#8211; สร้าง user สำหรับ Replication</h4>
<p>เริ่มต้น ต้องสร้าง user ของ MySQL บนเครื่อง Master เพื่ออนุญาตสิทธิในการทำ &#8216;REPLICATION&#8217; จากเครื่อง Slave</p>
<p>ตัวอย่างการสร้าง user ชื่อ &#8216;repl&#8217; และรหัส &#8216;repl1234&#8242;เพื่อให้สิทธิการทำ REPLICATION จากเครื่องที่มี ip 192.168.1.2</p>
<pre>[root@centos54-a ~]# <strong>mysql -u root -p</strong></pre>
<pre>mysql&gt; <strong>GRANT REPLICATION SLAVE ON *.* TO '<span style="color: #0000ff;">repl</span>'@'<span style="color: #0000ff;">192.168.1.2</span>' IDENTIFIED BY '<span style="color: #0000ff;">repl1234</span>';</strong></pre>
<h4>เครื่อง Master &#8211; คอนฟิก Replication Master</h4>
<p>บนเครื่อง Master ปิดเซอร์วิส MySQL แล้วแก้ไขไฟล์ /etc/my.cnf เพื่อเปิดคุณสมบัติ binary log (log-bin) และเซ็ต server-id</p>
<pre>[root@centos54-a ~]# <strong>service mysql stop
</strong>Shutting down MySQL..                                      [  OK  ]</pre>
<p>ตัวอย่างไฟล์คอนฟิก /etc/my.cnf เพื่อคอนฟิกเป็น Replication Master</p>
<pre>[root@centos54-a ~]# <strong>cat /etc/my.cnf
</strong>[mysqld]
log-bin=mysql-bin
server-id=1</pre>
<p>ใช้คำสั่ง service เพื่อรันเซอร์วิส MySQL</p>
<pre>[root@centos54-a ~]# <strong>service mysql start
</strong>Starting MySQL.                                            [  OK  ]</pre>
<h4>เครื่อง Master &#8211; ตรวจสอบสถานะของ Master Binary Log</h4>
<p>บนเครื่อง Master ใช้คำสั่ง SHOW MASTER STATUS ตรวจสอบสถานะของ Master Binary Log</p>
<p>เราจะใช้ค่า &#8216;File&#8217; และ &#8216;Position&#8217; เพื่อระบุบนเครื่อง Slave</p>
<pre>[root@centos54-a ~]# <strong>mysql -u root -p</strong></pre>
<pre>mysql&gt; <strong>SHOW MASTER STATUS;
</strong>+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| <strong><span style="color: #0000ff;">mysql-bin.000001</span></strong> |      <strong><span style="color: #0000ff;">224</span> </strong>|              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)</pre>
<h4>เครื่อง Slave &#8211; คอนฟิก Replication Slave</h4>
<p>บนเครื่อง Slave ปิดเซอร์วิส MySQL เพื่อแก้ไขคอนฟิกไฟล์ /etc/my.cnf</p>
<pre>[root@centos54-b ~]# <strong>service mysql stop
</strong>Shutting down MySQL..                                      [  OK  ]</pre>
<p>เบื้องต้นบนเครื่อง Slave คอนฟิกแค่ &#8216;server-id&#8217; ที่มีค่าแตกต่างจากเครื่อง Master</p>
<pre>[root@centos54-b ~]# <strong>cat /etc/my.cnf
</strong>[mysqld]
server-id=2</pre>
<p>รันเซอร์วิส MySQL บนเครื่อง Slave</p>
<pre>[root@centos54-b ~]# <strong>service mysql start
</strong>Starting MySQL.                                            [  OK  ]</pre>
<p>ใช้คำสั่ง CHANGE MASTER เพื่อระบุ ip ของ Master ชื่อ user, password ที่ใช้เพื่อการทำ Replication และต้องระบุค่า log_file (File) และ log_pos (Position) ที่ได้จากผลลัพธ์ในการรันคำสั่ง SHOW MASTER STATUS บนเครื่อง Master</p>
<pre>mysql&gt; <strong>CHANGE MASTER TO MASTER_HOST='<span style="color: #0000ff;">192.168.1.1</span>',
                        MASTER_USER='<span style="color: #0000ff;">repl</span>',
                        MASTER_PASSWORD='<span style="color: #0000ff;">repl1234</span>',
                        MASTER_LOG_FILE='<span style="color: #0000ff;">mysql-bin.000001</span>',
                        MASTER_LOG_POS=<span style="color: #0000ff;">224</span>;
</strong>Query OK, 0 rows affected (0.03 sec)</pre>
<p>รันคำสั่ง START SLAVE เพื่อเริ่มต้นการทำ Replicate ข้อมูลจาก เครื่อง Master</p>
<pre>mysql&gt; <strong>START SLAVE;
</strong>Query OK, 0 rows affected (0.00 sec)</pre>
<p>ตรวจสอบสถานะ Replication บนเครื่อง Slave</p>
<pre>mysql&gt; <strong>SHOW SLAVE STATUS \G
</strong>*************************** 1. row ***************************
               <span style="color: #0000ff;">Slave_IO_State: Waiting for master to send event
</span>                  Master_Host: <span style="color: #0000ff;">192.168.1.1
</span>                  Master_User: <span style="color: #0000ff;">repl</span>
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: <span style="color: #0000ff;">mysql-bin.000001
</span>          Read_Master_Log_Pos: <span style="color: #0000ff;">244</span>
               Relay_Log_File: centos54-b-relay-bin.000004
                Relay_Log_Pos: 251
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 244
              Relay_Log_Space: 411
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
1 row in set (0.00 sec)</pre>
<p>หากคอนฟิกถูกต้อง ค่า &#8216;Slave_IO_State&#8217; จะแสดงเป็น &#8216;Waiting for master to send event&#8217;</p>
<h4>ทดสอบการ Replication</h4>
<p>เพื่อง่ายต่อการแยกแยะระหว่าง Master และ Slave ในที่นี้จะคอนฟิก mysql prompt เป็น mysql-1&gt; และ mysql-2&gt; ตามลำดับ</p>
<p>การคอนฟิก prompt บนเครื่อง Master</p>
<pre>[root@centos54-a ~]# <strong>mysql -u root -p
</strong>Enter password:</pre>
<pre>mysql&gt; <strong>PROMPT mysql-1&gt;
</strong>PROMPT set to 'mysql-1&gt; '
<span style="color: #0000ff;">mysql-1&gt;</span></pre>
<p>การคอนฟิก prompt บนเครื่อง Slave</p>
<pre>[root@centos54-b ~]# <strong>mysql -u root -p
</strong>Enter password:</pre>
<pre>mysql&gt; <strong>PROMPT mysql-2&gt;
</strong>PROMPT set to 'mysql-2&gt; '
<span style="color: #0000ff;">mysql-2&gt;</span></pre>
<p>ทดสอบสร้าง database บนเครื่อง Master</p>
<pre>mysql-1&gt; <strong>CREATE DATABASE <span style="color: #0000ff;">test1</span>;
</strong>Query OK, 1 row affected (0.01 sec)</pre>
<pre>mysql-1&gt; <strong>SHOW DATABASES;
</strong>+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| <span style="color: #0000ff;">test1</span>              |
+--------------------+
3 rows in set (0.00 sec)</pre>
<p>ข้อมูลการสร้าง database จะถูกส่งต่อ (replicate) ไปยังเครื่อง Slave โดยอัตโนมัติ</p>
<pre>mysql-2&gt; <strong>SHOW DATABASES;
</strong>+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| <span style="color: #0000ff;">test1</span>              |
+--------------------+
3 rows in set (0.00 sec)</pre>
<p>สร้าง table และทดสอบการ INSERT ข้อมูล</p>
<pre>mysql-1&gt; <strong>CONNECT test1
</strong>mysql-1&gt; <strong>CREATE TABLE books (id INTEGER, name VARCHAR(255));
</strong>mysql-1&gt; <strong>INSERT INTO books VALUES (1, 'how to setup...');
</strong>mysql-1&gt; <strong>INSERT INTO books VALUES (2, 'how to read...');</strong></pre>
<pre>mysql-1&gt; <strong>SELECT * FROM books;
</strong>+------+-----------------+
| id   | name            |
+------+-----------------+
|    1 | how to setup... |
|    2 | how to read...  |
+------+-----------------+
2 rows in set (0.00 sec)</pre>
<p>การเปลี่ยนแปลงบนเครื่อง Master จะถูก replicate ไปยังเครื่อง Slave โดยอัตโนมัติ</p>
<pre>mysql-2&gt; <strong>CONNECT test1;
</strong>mysql-2&gt; <strong>SELECT * FROM books;
</strong>+------+-----------------+
| id   | name            |
+------+-----------------+
|    1 | how to setup... |
|    2 | how to read...  |
+------+-----------------+
2 rows in set (0.00 sec)</pre>
<h4>ข้อมูลอ้างอิง</h4>
<ul>
<li><a href="http://dev.mysql.com/doc/refman/5.1/en/replication.html" target="_blank">MySQL 5.1 Reference Manual :: Replication</a></li>
<li><a href="http://spalinux.com/2009/02/install_mysql_51_on_fedora_10">ติดตั้ง MySQL 5.1 บน Fedora 10</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://spalinux.com/2010/02/configure_mysql_replication/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>ทดสอบ FOREIGN KEY Constraints ใน MySQL</title>
		<link>http://spalinux.com/2010/01/testing_mysql_foreign_key_constraints</link>
		<comments>http://spalinux.com/2010/01/testing_mysql_foreign_key_constraints#comments</comments>
		<pubDate>Sat, 23 Jan 2010 10:13:04 +0000</pubDate>
		<dc:creator>editor</dc:creator>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[mysql constraints]]></category>
		<category><![CDATA[mysql foreign key]]></category>

		<guid isPermaLink="false">http://spalinux.com/?p=1061</guid>
		<description><![CDATA[บทความนี้ต่อจาก การสร้าง FOREIGN KEY Constraints ใน MySQL เพื่อทดสอบการ เพิ่ม แก้ไข ลบ ข้อมูล โดยในเวลาเริ่มแต่ละหัวข้อจะใช้ข้อมูลนี้เป็นหลัก mysql&#62; SELECT * FROM groups; +----------+------------+ &#124; group_id &#124; group_name &#124; +----------+------------+ &#124;      101 &#124; Accounting &#124; &#124;      102 &#124; Engineer   &#124; &#124;      103 &#124; IT         &#124; &#124;      104 &#124; Manager    &#124; +----------+------------+ 4 rows in set (0.00 sec) mysql&#62; SELECT * FROM [...]]]></description>
			<content:encoded><![CDATA[<p>บทความนี้ต่อจาก <a href="http://spalinux.com/2010/01/creating_mysql_foreign_key_constraints">การสร้าง FOREIGN KEY Constraints ใน MySQL</a> เพื่อทดสอบการ เพิ่ม แก้ไข ลบ ข้อมูล โดยในเวลาเริ่มแต่ละหัวข้อจะใช้ข้อมูลนี้เป็นหลัก</p>
<pre><span id="more-1061"></span>mysql&gt; <strong>SELECT * FROM groups;
</strong>+----------+------------+
| group_id | group_name |
+----------+------------+
|      101 | Accounting |
|      102 | Engineer   |
|      103 | IT         |
|      104 | Manager    |
+----------+------------+
4 rows in set (0.00 sec)</pre>
<pre>mysql&gt; <strong>SELECT * FROM users;
</strong>+---------+----------+-----------+
| user_id | group_id | user_name |
+---------+----------+-----------+
|     501 |      101 | Ms.A      |
|     502 |      102 | Ms.B      |
|     503 |      102 | Mr.C      |
|     504 |      103 | Mr.D      |
|     505 |      104 | Mr.E      |
+---------+----------+-----------+
5 rows in set (0.00 sec)</pre>
<h4>การ DELETE ข้อมูล</h4>
<p>หลังจากใส่ FOREIGN KEY ในตาราง users เรียบร้อยแล้ว ทดสอบการลบ DELETE กลุ่ม &#8216;IT&#8217; ออกจาก table &#8216;groups&#8217;</p>
<pre>mysql&gt; <strong>DELETE FROM groups WHERE group_id='103';
</strong><span style="color: #ff0000;">ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails
</span>(`test_db`.`users`, CONSTRAINT `users_ibfk_1` FOREIGN KEY (`group_id`) REFERENCES `groups` (`group_id`))</pre>
<p>ข้อมูลกลุ่ม &#8216;IT&#8217; ยังอยู่ใน table &#8216;groups&#8217;</p>
<pre>mysql&gt; <strong>SELECT * FROM groups;
</strong>+----------+------------+
| group_id | group_name |
+----------+------------+
|      101 | Accounting |
|      102 | Engineer   |
|      103 | IT         |
|      104 | Manager    |
+----------+------------+
4 rows in set (0.00 sec)</pre>
<p>เราไม่สามารถลบ group &#8216;IT&#8217; ได้ เนื่องจากมีการอ้างอิงจาก table &#8216;users&#8217;</p>
<p>หากต้องการจะลบ ต้องแก้ไขข้อมูลที่มีการอ้างอิงมายัง group &#8216;IT&#8217; นี้ (group_id=103) เช่นในที่นี้ต้องเปลี่ยน group_id ของ &#8216;Mr.D&#8217; ไปเป็นกลุ่มอื่น เช่นเปลี่ยนเป็น กลุ่ม &#8216;Engineer&#8217;</p>
<p>ตรวจสอบว่าใครอยู่ group &#8216;IT&#8217; บ้าง</p>
<pre>mysql&gt; <strong>SELECT * FROM users WHERE group_id=103;
</strong>+---------+----------+-----------+
| user_id | group_id | user_name |
+---------+----------+-----------+
|     504 |      103 | Mr.D      |
+---------+----------+-----------+
1 row in set (0.00 sec)</pre>
<p>เปลี่ยนกลุ่มของ &#8216;MR.D&#8217; เป็น Engineer</p>
<pre>mysql&gt; <strong>UPDATE users SET group_id=102 WHERE user_id=504;
</strong>Query OK, 0 rows affected (0.00 sec)
Rows matched: 1  Changed: 0  Warnings: 0</pre>
<p>ตรวจสอบว่าใครอยู่ group &#8216;IT&#8217; อีกครั้ง</p>
<pre>mysql&gt; <strong>SELECT * FROM users WHERE group_id=103;
</strong>Empty set (0.00 sec)</pre>
<p>ทดสอบการลบกลุ่ม IT</p>
<pre>mysql&gt; <strong>DELETE FROM groups WHERE group_id=103;
</strong>Query OK, 1 row affected (0.00 sec)</pre>
<p>ครั้งนี้จะสามารถลบได้แล้ว เพราะไม่มี user คนไหนอยู่ในกลุ่มนี้แล้ว</p>
<h4>การ INSERT, UPDATE ข้อมูล</h4>
<p>จะด้วยความผิดพลาดของโปรแกรมหรือตั้งใจ สมมติเราเพิ่ม users ใหม่ แล้วตั้ง group_id=109 ซึ่งไม่มีอยู่ใน table &#8216;groups&#8217;</p>
<pre>mysql&gt; <strong>INSERT INTO users (user_id, group_id, user_name) VALUES (506, <span style="color: #ff0000;">109</span>, 'Mr.X');
</strong><span style="color: #ff0000;">ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails
</span>(`test_db`.`users`, CONSTRAINT `users_ibfk_1` FOREIGN KEY (`group_id`) REFERENCES `groups` (`group_id`))</pre>
<p>เราจะไม่สามารถ INSERT ข้อมูลแบบนี้ได้ ต้องไปสร้าง group_id 109 ใน table &#8216;groups&#8217; ก่อน</p>
<p>เช่นเดียวกัน เราไม่สามารถ UPDATE ข้อมูลที่ไม่ถูกต้องได้</p>
<pre>mysql&gt; <strong>UPDATE users SET group_id=109 WHERE user_id=505;
</strong><span style="color: #ff0000;">ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails
</span>(`test_db`.`users`, CONSTRAINT `users_ibfk_1` FOREIGN KEY (`group_id`) REFERENCES `groups` (`group_id`))</pre>
<h4>การ DROP TABLE</h4>
<p>หากยังมีการอ้างอิงฟิลด์ข้อมูลอยู่ เราไม่สามารถ DROP TABLE ที่ยังมีข้อมูลอ้างอิงอยู่ได้ เช่นในที่นี้เราไม่สามารถ DROP TABLE groups ได้</p>
<pre>mysql&gt; <strong>DROP TABLE groups;
</strong><span style="color: #ff0000;">ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails</span></pre>
<p>ถึงแม้ไม่มีข้อมูล rows ใดเลยใน users ก็ไม่สามารถ DROP TABLE groups ได้</p>
<pre>mysql&gt; <strong>DELETE FROM users;
</strong>Query OK, 5 rows affected (0.00 sec)</pre>
<pre>mysql&gt; <strong>DROP TABLE groups;
</strong>ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails</pre>
<h4>ข้อมูลอ้างอิง</h4>
<ul>
<li><a href="http://spalinux.com/2010/01/creating_mysql_foreign_key_constraints">การสร้าง FOREIGN KEY Constraints ใน MySQL</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://spalinux.com/2010/01/testing_mysql_foreign_key_constraints/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>การสร้าง FOREIGN KEY Constraints ใน MySQL</title>
		<link>http://spalinux.com/2010/01/creating_mysql_foreign_key_constraints</link>
		<comments>http://spalinux.com/2010/01/creating_mysql_foreign_key_constraints#comments</comments>
		<pubDate>Sat, 23 Jan 2010 09:22:39 +0000</pubDate>
		<dc:creator>editor</dc:creator>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[mysql constraints]]></category>
		<category><![CDATA[mysql foreign key]]></category>

		<guid isPermaLink="false">http://spalinux.com/?p=1053</guid>
		<description><![CDATA[ส่วนใหญ่แล้วการออกแบบฐานข้อมูลจะมีการใช้บางฟิลด์ข้อมูล เพื่อเชื่อมโยงความสัมพันธ์ระหว่าง table ทำให้ต้องมีการคำนึงถึงเวลา เพิ่ม แก้ไข หรือ ลบฟิลด์ที่ใช้เชื่อมนั้น ไม่เช่นนั้นข้อมูลในฐานข้อมูลอาจมีปัญหาได้ MySQL สนับสนุนคุณสมบัติการใช้ FOREIGN KEY Constraints เพื่อแก้ไขปัญหานี้ได้ แต่ต้องใช้ table เป็นแบบ InnoDB ในบทความนี้ขออธิบายปัญหาที่เกิดขึ้น พร้อมยกตัวอย่างวิธีการใช้ FOREIGN KEY Constraints เพื่อป้องกันปัญหาได้ ตัวอย่างเช่น ต้องการสร้างฐานข้อมูลสำหรับเก็บชื่อ users และแต่ละคนเป็นสมาชิกได้ 1 กลุ่มจากตาราง groups เริ่มต้นออกแบบ table ง่ายๆ ได้ดังนี้ mysql&#62; CREATE TABLE groups (  group_id     INT UNSIGNED NOT NULL,  group_name   VARCHAR(255),  PRIMARY KEY    (group_id) ); mysql&#62; CREATE TABLE [...]]]></description>
			<content:encoded><![CDATA[<p>ส่วนใหญ่แล้วการออกแบบฐานข้อมูลจะมีการใช้บางฟิลด์ข้อมูล เพื่อเชื่อมโยงความสัมพันธ์ระหว่าง table ทำให้ต้องมีการคำนึงถึงเวลา เพิ่ม แก้ไข หรือ ลบฟิลด์ที่ใช้เชื่อมนั้น ไม่เช่นนั้นข้อมูลในฐานข้อมูลอาจมีปัญหาได้</p>
<p>MySQL สนับสนุนคุณสมบัติการใช้ FOREIGN KEY Constraints เพื่อแก้ไขปัญหานี้ได้ แต่ต้องใช้ table เป็นแบบ InnoDB ในบทความนี้ขออธิบายปัญหาที่เกิดขึ้น พร้อมยกตัวอย่างวิธีการใช้ FOREIGN KEY Constraints เพื่อป้องกันปัญหาได้</p>
<p><span id="more-1053"></span></p>
<p>ตัวอย่างเช่น ต้องการสร้างฐานข้อมูลสำหรับเก็บชื่อ users และแต่ละคนเป็นสมาชิกได้ 1 กลุ่มจากตาราง groups เริ่มต้นออกแบบ table ง่ายๆ ได้ดังนี้</p>
<pre>mysql&gt; <strong>CREATE TABLE groups (
 group_id     INT UNSIGNED NOT NULL,
 group_name   VARCHAR(255),
 PRIMARY KEY    (group_id)
);</strong></pre>
<pre>mysql&gt; <strong>CREATE TABLE users (
 user_id      INT UNSIGNED NOT NULL,
 group_id     INT UNSIGNED NOT NULL,
 user_name    VARCHAR(255),
 PRIMARY KEY    (user_id)
);</strong></pre>
<p>ใส่ข้อมูลทดสอบดังนี้</p>
<pre>mysql&gt; <strong>INSERT INTO groups (group_id, group_name) VALUES
 (101, 'Accounting'),
 (102, 'Engineer'),
 (103, 'IT'),
 (104, 'Manager');</strong></pre>
<pre>mysql&gt; <strong>INSERT INTO users (user_id, group_id, user_name) VALUES
 (501, 101, 'Ms.A'),
 (502, 102, 'Ms.B'),
 (503, 102, 'Mr.C'),
 (504, 103, 'Mr.D'),
 (505, 104, 'Mr.E');</strong></pre>
<p>จากฐานข้อมูลตัวอย่าง เราใช้ฟิลด์ group_id ในการเชื่อมโยงความสัมพันธ์ระหว่าง groups และ users เพื่อระบุว่า แต่ละ users อยู่ใน group ใด</p>
<p>หากมีการแก้ไขข้อมูล เช่นต้องการลบ (DELETE) ข้อมูล group ที่ชื่อ &#8216;IT&#8217; ออกจากฐานข้อมูล หากไม่มีวิธีการตรวจสอบ ไปลบแค่จากตาราง &#8216;groups&#8217; จะทำให้ ข้อมูลของ &#8216;Mr.D&#8217; ในตาราง &#8216;users&#8217; มีปัญหาทันที เพราะไม่สามารถอ้างอิงกลับมายังชื่อ group ได้</p>
<p>โดยดีฟอลต์ การสร้าง table ใน MySQL หากไม่มีการระบุชนิด ในคำสั่ง &#8216;CREATE TABLE&#8217; ตารางที่สร้างได้จะเป็นแบบ MyISAM ซึ่งไม่สามารถสร้าง FOREIGN KEY ได้</p>
<p>สามารถใช้คำสั่ง &#8216;SHOW ENGINES&#8217; ใน mysql เพื่อตรวจสอบชนิดของ table ที่สร้างได้</p>
<pre>mysql&gt; <strong>SHOW ENGINES;
</strong>+------------+---------+------------------------------------------------------------+--------------+------+------------+
| Engine     | Support | Comment                                                    | Transactions | XA   | Savepoints |
+------------+---------+------------------------------------------------------------+--------------+------+------------+
| ndbcluster | NO      | Clustered, fault-tolerant tables                           | NULL         | NULL | NULL       |
| MRG_MYISAM | YES     | Collection of identical MyISAM tables                      | NO           | NO   | NO         |
| CSV        | YES     | CSV storage engine                                         | NO           | NO   | NO         |
| <strong><span style="color: #0000ff;">MyISAM</span>     </strong>| <strong><span style="color: #0000ff;">DEFAULT</span> </strong>| Default engine as of MySQL 3.23 with great performance     | NO           | NO   | NO         |
| <strong><span style="color: #0000ff;">InnoDB</span></strong>     | <strong><span style="color: #0000ff;">YES</span></strong>     | Supports transactions, row-level locking, and <strong><span style="color: #0000ff;">foreign keys</span></strong> | YES          | YES  | YES        |
| MEMORY     | YES     | Hash based, stored in memory, useful for temporary tables  | NO           | NO   | NO         |
+------------+---------+------------------------------------------------------------+--------------+------+------------+</pre>
<p>ถ้าจะใช้ FOREIGN KEY ได้นั้น table ที่มีการอ้างอิงกันทั้งหมด ต้องเป็นชนิด InnoDB คือต้องระบุออปชั่น ENGINE=InnoDB เวลาสร้าง table</p>
<p>เมื่อสร้างเป็น InnoDB แล้ว ระบุฟิลด์ที่ต้องการตรวจสอบ constraints ใน table ที่ใช้อ้างอิงไปยัง table อื่น</p>
<p>เช่นในที่นี้เราต้องการให้ table &#8216;users&#8217; ใช้ฟิลด์ชื่อ group_id เพื่ออ้างอิงไปยัง table &#8216;groups&#8217; เราต้องระบุ FOREIGN KEY ใน table &#8216;users&#8217;</p>
<p>วิธีการระบุการอ้างอิง FOREIGN KEY ฟิลด์ &#8216;group_id&#8217; จาก table &#8216;groups&#8217;</p>
<pre><span style="color: #0000ff;"><strong>FOREIGN KEY (group_id) REFERENCES groups(group_id)</strong></span></pre>
<p>วิธีการเปลี่ยน table จาก MyISAM ให้เป็น InnoDB และเพิ่ม FOREIGN KEY ทำได้ 2 วิธี</p>
<p> 1. ใช้คำสั่ง &#8216;ALTER TABLE&#8217; เพื่อแก้ไข<br />
 2. ใช้คำสั่ง &#8216;DROP TABLE&#8217; ทิ้งไปแล้วสร้างใหม่ แต่ข้อมูลที่มีอยู่จะหายหมด</p>
<h4>ใช้คำสั่ง ALTER TABLE เพื่อเปลี่ยนชนิดเป็น InnoDB</h4>
<p>เราสามารถใช้คำสั่ง &#8216;ALTER TABLE&#8217; เพื่อเปลี่ยนชนิดของ table หรือแก้ไขฟิลด์ต่างๆ ได้</p>
<p>การใช้คำสั่ง ALTER TABLE เพื่อเปลี่ยนชนิด table เป็นแบบ InnoDB</p>
<pre>mysql&gt; <strong>ALTER TABLE groups ENGINE=InnoDB;
</strong>Query OK, 4 rows affected (0.01 sec)
Records: 4  Duplicates: 0  Warnings: 0</pre>
<pre>mysql&gt; <strong>ALTER TABLE users ENGINE=InnoDB;
</strong>Query OK, 5 rows affected (0.01 sec)
Records: 5  Duplicates: 0  Warnings: 0</pre>
<p>เพิ่ม FOREIGN KEY ใน table &#8216;users&#8217;</p>
<pre>mysql&gt; <strong>ALTER TABLE `users` ADD FOREIGN KEY (group_id) REFERENCES groups(group_id);
</strong>Query OK, 5 rows affected (0.01 sec)
Records: 5  Duplicates: 0  Warnings: 0</pre>
<p>หมายเหตุ ต้องดูผลลัพธ์การใช้คำสั่ง ALTER TABLE ด้วย ว่าการเปลี่ยนแปลง table สำเร็จหรือไม่</p>
<h4>ลบแล้วสร้าง TABLE ใหม่แบบ InnoDB และใช้ FOREIGN KEY</h4>
<p>ใช้คำสั่ง DROP TABLE เพื่อลบ table &#8216;users&#8217;</p>
<pre>mysql&gt; <strong>DROP TABLE users;
</strong>mysql&gt; <strong>DROP TABLE groups;</strong></pre>
<p>ใช้คำสั่ง CREATE TABLE เพื่อสร้าง table ใหม่ แล้ว ใส่ข้อมูลลงไปเหมือนเดิม</p>
<pre>mysql&gt; <strong>CREATE TABLE groups (
 group_id     INT UNSIGNED NOT NULL,
 group_name   VARCHAR(255),
 PRIMARY KEY    (group_id)
) <span style="color: #0000ff;">ENGINE=InnoDB</span>;</strong></pre>
<pre>mysql&gt; <strong>INSERT INTO groups (group_id, group_name) VALUES
 (101, 'Accounting'),
 (102, 'Engineer'),
 (103, 'IT'),
 (104, 'Manager');</strong></pre>
<pre>mysql&gt; <strong>CREATE TABLE users (
 user_id      INT UNSIGNED NOT NULL,
 group_id     INT UNSIGNED NOT NULL,
 user_name    VARCHAR(255),
 PRIMARY KEY    (user_id),
<span style="color: #0000ff;"> FOREIGN KEY (group_id) REFERENCES groups(group_id)
</span>) <span style="color: #0000ff;">ENGINE=InnoDB;</span></strong></pre>
<pre>mysql&gt; <strong>INSERT INTO users (user_id, group_id, user_name) VALUES
 (501, 101, 'Ms.A'),
 (502, 102, 'Ms.B'),
 (503, 102, 'Mr.C'),
 (504, 103, 'Mr.D'),
 (505, 104, 'Mr.E');</strong></pre>
<p>สังเกตสิ่งที่เพิ่มขึ้น</p>
<h4>ข้อมูลอ้างอิง</h4>
<ul>
<li><a href="http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html" target="_blank">MySQL 5.1 Reference Manual :: 13.6.4.4 FOREIGN KEY Constraints</a></li>
<li><a href="http://spalinux.com/2010/01/testing_mysql_foreign_key_constraints">ทดสอบ FOREIGN KEY Constraints ใน MySQL</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://spalinux.com/2010/01/creating_mysql_foreign_key_constraints/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>ติดตั้งและคอนฟิก MySQL ODBC ตอนที่ 2</title>
		<link>http://spalinux.com/2009/12/install_configure_mysql_odbc_part_2</link>
		<comments>http://spalinux.com/2009/12/install_configure_mysql_odbc_part_2#comments</comments>
		<pubDate>Fri, 04 Dec 2009 16:03:57 +0000</pubDate>
		<dc:creator>editor</dc:creator>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[MyODBC]]></category>
		<category><![CDATA[ODBC]]></category>

		<guid isPermaLink="false">http://spalinux.com/?p=1018</guid>
		<description><![CDATA[หลังจาก ติดตั้งและคอนฟิก MySQL ODBC ตอนที่ 1 ก่อนที่จะใช้ ODBC เพื่อดึงข้อมูลจากฐานข้อมูล MySQL ได้ ต้องมีการคอนฟิกค่าพารามิเตอร์ต่างๆ ก่อน  ในตอนที่ 2 นี้จะแสดงตัวอย่างการคอนฟิกค่า ODBC เพื่อจะเชื่อมต่อเข้ากับ Database Server และตัวอย่างการใช้โปรแกรม Excel เพื่อดึงข้อมูลมาจากฐานข้อมูล MySQL คอนฟิก ODBC การคอนฟิก ODBC บน Windows จะเป็นการสร้าง DSN (Data Source Name) ซึ่งสามารถเริ่มต้นทำได้โดยไปที่ Control Panel &#8211;&#62; Administrative Tools &#8211;&#62; Data Sources (ODBC)   เลือก driver เป็นแบบ MySQL ODBC 5.1 Driver    ใส่ค่าพารามิเตอร์สำหรับการเชื่อมต่อฐานข้อมูล Data [...]]]></description>
			<content:encoded><![CDATA[<p>หลังจาก <a href="http://spalinux.com/2009/12/install_configure_mysql_odbc_part_1">ติดตั้งและคอนฟิก MySQL ODBC ตอนที่ 1</a> ก่อนที่จะใช้ ODBC เพื่อดึงข้อมูลจากฐานข้อมูล MySQL ได้ ต้องมีการคอนฟิกค่าพารามิเตอร์ต่างๆ ก่อน </p>
<p>ในตอนที่ 2 นี้จะแสดงตัวอย่างการคอนฟิกค่า ODBC เพื่อจะเชื่อมต่อเข้ากับ Database Server และตัวอย่างการใช้โปรแกรม Excel เพื่อดึงข้อมูลมาจากฐานข้อมูล MySQL</p>
<p><span id="more-1018"></span></p>
<h4>คอนฟิก ODBC</h4>
<p>การคอนฟิก ODBC บน Windows จะเป็นการสร้าง DSN (Data Source Name) ซึ่งสามารถเริ่มต้นทำได้โดยไปที่</p>
<p>Control Panel &#8211;&gt; Administrative Tools &#8211;&gt; Data Sources (ODBC)</p>
<p><img class="alignnone size-full wp-image-1020" title="B1 User DSN" src="http://spalinux.com/wp-content/uploads/2009/12/B1_User_DSN.png" alt="B1 User DSN" width="461" height="384" /></p>
<p> </p>
<p>เลือก driver เป็นแบบ MySQL ODBC 5.1 Driver </p>
<p><img class="alignnone size-full wp-image-1021" title="B2 Create New Data Source" src="http://spalinux.com/wp-content/uploads/2009/12/B2_Create_New_Data_Source.png" alt="B2 Create New Data Source" width="468" height="352" /></p>
<p> </p>
<p>ใส่ค่าพารามิเตอร์สำหรับการเชื่อมต่อฐานข้อมูล</p>
<p><strong>Data Source Name</strong> : ตั้งชื่อ DSN<br />
<strong>Server</strong> : ชื่อ Hostname หรือ IP Address ของ Database Server<br />
<strong>Port </strong>: พอร์ตของ MySQL ดีฟอลต์ 3306<br />
<strong>User</strong> : Username สำหรับการล็อกเข้าฐานข้อมูล<br />
<strong>Password</strong> : รหัสผ่าน<br />
<strong>Database</strong> : ชื่อ Database ที่ต้องการ </p>
<p>หากใส่ข้อมูล Server, User, Password ถูกต้อง จะสามารถเลือกชื่อ Database ในช่อง Database ได้</p>
<p><img title="B3 Connection Parameters" src="http://spalinux.com/wp-content/uploads/2009/12/B3_Connection_Parameters.png" alt="B3 Connection Parameters" width="425" height="410" /></p>
<p> </p>
<p>ตัวอย่างผลลัพธ์จากการกดปุ่ม [Test]</p>
<p><img title="B4 Test Result" src="http://spalinux.com/wp-content/uploads/2009/12/B4_Test_Result.png" alt="B4 Test Result" width="134" height="107" /></p>
<p> </p>
<p>หลังจากคอนฟิกเรียบร้อย จะมีชื่อ DSN ที่เพิ่มขึ้น</p>
<p><img title="B5 Finished" src="http://spalinux.com/wp-content/uploads/2009/12/B5_Finished.png" alt="B5 Finished" width="461" height="384" /></p>
<p> </p>
<h4> ทดลองดึงข้อมูลด้วย Excel</h4>
<p>เพื่อความง่ายในการทดสอบ จะใช้ Microsoft Excel  </p>
<p> เปิดโปรแกรม Excel</p>
<p><img title="C1 New Excel File" src="http://spalinux.com/wp-content/uploads/2009/12/C1_New_Excel_File.png" alt="C1 New Excel File" width="698" height="312" /></p>
<p> </p>
<p>เลือกเมนู Data &#8211;&gt; Import External Data &#8211;&gt; Import Data จะมีหน้าต่าง &#8220;Select Data Source&#8221; แสดงขึ้นมา</p>
<p>เลือก &#8220;+Connect to New Data Source.odc&#8221; แล้วกดปุ่ม [Open]</p>
<p><img title="C2 Select Data Source" src="http://spalinux.com/wp-content/uploads/2009/12/C2_Select_Data_Source.png" alt="C2 Select Data Source" width="601" height="393" /></p>
<p> </p>
<p>หน้าจอ Wizard ช่วยในการคอนฟิก เลือก &#8220;ODBC DSN&#8221;</p>
<p><img title="C3 Data Connection Wizard" src="http://spalinux.com/wp-content/uploads/2009/12/C3_Data_Connection_Wizard.png" alt="C3 Data Connection Wizard" width="498" height="363" /></p>
<p> </p>
<p>เลือกชื่อ Data Source ที่คอนฟิกไว้แล้ว</p>
<p><img title="C4 Choose Data Source" src="http://spalinux.com/wp-content/uploads/2009/12/C4_Choose_Data_Source.png" alt="C4 Choose Data Source" width="498" height="363" /></p>
<p> </p>
<p>เลือกชื่อ Database และ Table ที่ต้องการจะดึงข้อมูล</p>
<p><img title="C5 Select Database and Table" src="http://spalinux.com/wp-content/uploads/2009/12/C5_Select_Database_and_Table.png" alt="C5 Select Database and Table" width="498" height="369" /></p>
<p> </p>
<p>สามารถเซฟคอนฟิกที่สร้างไว้ เป็นไฟล์ เพื่อสะดวกในการดึงข้อมูลครั้งต่อไปได้</p>
<p><img title="C6 Save Data Connection File" src="http://spalinux.com/wp-content/uploads/2009/12/C6_Save_Data_Connection_File.png" alt="C6 Save Data Connection File" width="509" height="363" /></p>
<p> </p>
<p> เลือกช่องใส่ข้อมูลใน Excel แล้วกด [OK]</p>
<p><img title="C7 Where to put Data" src="http://spalinux.com/wp-content/uploads/2009/12/C7_Where_to_put_Data.png" alt="C7 Where to put Data" width="347" height="218" /></p>
<p> </p>
<p> ตัวอย่างผลลัพธ์การดึงข้อมูลจาก MySQL ผ่าน ODBC แล้วแสดงใน Excel</p>
<p><img title="C8 Imported Data" src="http://spalinux.com/wp-content/uploads/2009/12/C8_Imported_Data.png" alt="C8 Imported Data" width="726" height="459" /></p>
<p> </p>
<h4>ข้อมูลอ้างอิง</h4>
<ul>
<li><a href="http://spalinux.com/2009/12/install_configure_mysql_odbc_part_1">ติดตั้งและคอนฟิก MySQL ODBC ตอนที่ 1</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://spalinux.com/2009/12/install_configure_mysql_odbc_part_2/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ติดตั้งและคอนฟิก MySQL ODBC ตอนที่ 1</title>
		<link>http://spalinux.com/2009/12/install_configure_mysql_odbc_part_1</link>
		<comments>http://spalinux.com/2009/12/install_configure_mysql_odbc_part_1#comments</comments>
		<pubDate>Fri, 04 Dec 2009 11:39:06 +0000</pubDate>
		<dc:creator>editor</dc:creator>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[MyODBC]]></category>
		<category><![CDATA[ODBC]]></category>

		<guid isPermaLink="false">http://spalinux.com/?p=1005</guid>
		<description><![CDATA[บทความนี้จะกล่าวถึงการติดตั้งโปรแกรม MySQL Connector/ODBC (หรือชื่อเดิมคือ MyODBC) บน Windows XP เพื่อให้โปรแกรมที่รันอยู่บน Windows หรือโปรแกรมที่พัฒนาขึ้นมาเอง สามารถที่จะดึงข้อมูลจาก MySQL Database ได้ ในตอนแรกจะเป็นการสร้างตัวอย่างฐานข้อมูลสำหรับการทดสอบ และการติดตั้งโปรแกรม ODBC สร้างฐานข้อมูลสำหรับทดสอบ เพื่อการทดสอบการเชื่อมต่อ ODBC เราจะสร้าง User, Password, Database และ Table สำหรับการทดสอบ บน Database Server โดยมีรายละเอียดดังนี้ Database Name:    myodbc_test User:                          myodbc Password:               password Table Name:          test01 ตัวอย่างการใช้คำสั่งเพื่อสร้างฐานข้อมูลสำหรับทดสอบ mysql&#62; CREATE DATABASE myodbc_test; mysql&#62; GRANT ALL ON myodbc_test.* TO 'myodbc' IDENTIFIED [...]]]></description>
			<content:encoded><![CDATA[<p>บทความนี้จะกล่าวถึงการติดตั้งโปรแกรม MySQL Connector/ODBC (หรือชื่อเดิมคือ MyODBC) บน Windows XP เพื่อให้โปรแกรมที่รันอยู่บน Windows หรือโปรแกรมที่พัฒนาขึ้นมาเอง สามารถที่จะดึงข้อมูลจาก MySQL Database ได้</p>
<p>ในตอนแรกจะเป็นการสร้างตัวอย่างฐานข้อมูลสำหรับการทดสอบ และการติดตั้งโปรแกรม ODBC</p>
<h4><span id="more-1005"></span>สร้างฐานข้อมูลสำหรับทดสอบ</h4>
<p>เพื่อการทดสอบการเชื่อมต่อ ODBC เราจะสร้าง User, Password, Database และ Table สำหรับการทดสอบ บน Database Server โดยมีรายละเอียดดังนี้</p>
<p>Database Name:    myodbc_test<br />
User:                          myodbc<br />
Password:               password<br />
Table Name:          test01</p>
<p>ตัวอย่างการใช้คำสั่งเพื่อสร้างฐานข้อมูลสำหรับทดสอบ</p>
<pre>mysql&gt; <strong>CREATE DATABASE myodbc_test;
</strong>mysql&gt; <strong>GRANT ALL ON myodbc_test.* TO 'myodbc' IDENTIFIED BY 'password';
</strong>mysql&gt; <strong>USE myodbc_test;</strong></pre>
<pre>mysql&gt; <strong>CREATE TABLE `test01` (
  `id`      INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  `name`    VARCHAR(255),
  `email`   VARCHAR(255),
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM;</strong></pre>
<pre>mysql&gt; <strong>INSERT INTO test01 (id, name, email) VALUES (NULL, 'user01', 'user01@email.com');
</strong>mysql&gt; <strong>INSERT INTO test01 (id, name, email) VALUES (NULL, 'user02', 'user02@email.com');
</strong>mysql&gt; <strong>INSERT INTO test01 (id, name, email) VALUES (NULL, 'user03', 'user03@email.com');</strong></pre>
<pre>mysql&gt; <strong>SELECT * FROM test01;
</strong>+----+--------+------------------+
| id | name   | email            |
+----+--------+------------------+
|  1 | user01 | user01@email.com |
|  2 | user02 | user02@email.com |
|  3 | user03 | user03@email.com |
+----+--------+------------------+</pre>
<h4>ดาวน์โหลดและติดตั้ง</h4>
<p>ดาวน์โหลดโปรแกรม MySQL Connector/ODBC 5.1 ได้จาก <a href="http://dev.mysql.com/downloads/connector/odbc/5.1.html">http://dev.mysql.com/downloads/connector/odbc/5.1.html</a></p>
<p>เพื่อความง่ายแนะนำให้เลือกแบบ Windows MSI Installer (x86)</p>
<p>หมายเหตุ เวอร์ชั่นล่าสุดที่เขียนบทความคือ 5.1.6 ชื่อไฟล์คือ mysql-connector-odbc-5.1.6-win32.msi</p>
<p> คลิ้กที่ไฟล์เพื่อรันติดตั้งโปรแกรม</p>
<p><img class="alignnone size-full wp-image-1006" title="A1 Welcome to Setup Wizard" src="http://spalinux.com/wp-content/uploads/2009/12/A1_Welcome_to_Setup_Wizard.png" alt="A1 Welcome to Setup Wizard" width="504" height="386" /></p>
<p> </p>
<p>เลือก Setup Type เป็นแบบ Custom</p>
<p><img title="A2 Setup Type" src="http://spalinux.com/wp-content/uploads/2009/12/A2_Setup_Type.png" alt="A2 Setup Type" width="504" height="386" /></p>
<p> </p>
<p>เลือกทุก features แล้วกด [Next]</p>
<p><img title="A3 Select the Program Features" src="http://spalinux.com/wp-content/uploads/2009/12/A3_Select_the_Program_Features.png" alt="A3 Select the Program Features" width="504" height="386" /></p>
<p> </p>
<p> กดปุ่ม [Install]</p>
<p><img title="A4 Ready to Install the Program" src="http://spalinux.com/wp-content/uploads/2009/12/A4_Ready_to_Install_the_Program.png" alt="A4 Ready to Install the Program" width="504" height="386" /></p>
<p> </p>
<p>หน้าจอแสดงกำลังติดตั้งโปรแกรม </p>
<p> <img title="A5 Installing" src="http://spalinux.com/wp-content/uploads/2009/12/A5_Installing.png" alt="A5 Installing" width="504" height="386" /></p>
<p> </p>
<p>ติดตั้งเสร็จสิ้น </p>
<p><img title="A6 Wizard Completed" src="http://spalinux.com/wp-content/uploads/2009/12/A6_Wizard_Completed.png" alt="A6 Wizard Completed" width="504" height="386" /></p>
<p> </p>
<p>ข้อมูลอ้างอิง</p>
<ul>
<li><a href="http://dev.mysql.com/downloads/connector/odbc/5.1.html" target="_blank">MySQL Connector/ODBC 5.1</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://spalinux.com/2009/12/install_configure_mysql_odbc_part_1/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>โหลดข้อมูลเข้า MySQL ด้วย LOAD DATA INFILE</title>
		<link>http://spalinux.com/2009/08/mysql_load_data_infile</link>
		<comments>http://spalinux.com/2009/08/mysql_load_data_infile#comments</comments>
		<pubDate>Sat, 15 Aug 2009 08:08:21 +0000</pubDate>
		<dc:creator>editor</dc:creator>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[mysql load data]]></category>

		<guid isPermaLink="false">http://spalinux.com/?p=901</guid>
		<description><![CDATA[บ่อยครั้งที่เราได้ข้อมูลเป็นไฟล์ธรรมดาแบบ text แล้วเราต้องการนำข้อมูลนี้ใส่เข้าไปในฐานข้อมูลเช่น MySQL มีหลายวิธีในการเขียนโปรแกรม เพื่อจะโหลดข้อมูลเข้า MySQL ได้ ในบทความนี้ขอแนะนำวิธีการใช้คำสั่ง LOAD DATA INFILE ซึ่งเป็นคำสั่งใน MySQL เพื่อทำหน้าที่นี้โดยเฉพาะ และมีประสิทธิภาพ ความเร็วในการโหลดข้อมูลลงฐานข้อมูลสูงมาก ในที่นี้จะเปรียบเทียบความเร็วการเขียนโปรแกรมแบบเปิดไฟล์แล้ววนลูปทีละบรรทัดเพื่อโหลดข้อมูล กับการใช้คำสั่ง LOAD DATA INFILE ทีเดียวเลย ตัวอย่างข้อมูลที่ทดสอบ ในการทดสอบ เราจะสร้าง table ขึ้นมาแบบง่ายๆ มี 3 column ดังนี้ CREATE TABLE test_load (  id     INTEGER UNSIGNED AUTO_INCREMENT,  dat1   INTEGER UNSIGNED,  dat2   INTEGER UNSIGNED,  PRIMARY KEY(id) ); ส่วนไฟล์ข้อมูลที่เราจะโหลดทั้งหมด 10,000 บรรทัด มีสองฟิลด์คั่นด้วยเครื่องหมาย comma &#8220;,&#8221; [...]]]></description>
			<content:encoded><![CDATA[<p>บ่อยครั้งที่เราได้ข้อมูลเป็นไฟล์ธรรมดาแบบ text แล้วเราต้องการนำข้อมูลนี้ใส่เข้าไปในฐานข้อมูลเช่น MySQL มีหลายวิธีในการเขียนโปรแกรม เพื่อจะโหลดข้อมูลเข้า MySQL ได้</p>
<p>ในบทความนี้ขอแนะนำวิธีการใช้คำสั่ง LOAD DATA INFILE ซึ่งเป็นคำสั่งใน MySQL เพื่อทำหน้าที่นี้โดยเฉพาะ และมีประสิทธิภาพ ความเร็วในการโหลดข้อมูลลงฐานข้อมูลสูงมาก</p>
<p>ในที่นี้จะเปรียบเทียบความเร็วการเขียนโปรแกรมแบบเปิดไฟล์แล้ววนลูปทีละบรรทัดเพื่อโหลดข้อมูล กับการใช้คำสั่ง LOAD DATA INFILE ทีเดียวเลย</p>
<p><span id="more-901"></span></p>
<h4>ตัวอย่างข้อมูลที่ทดสอบ</h4>
<p>ในการทดสอบ เราจะสร้าง table ขึ้นมาแบบง่ายๆ มี 3 column ดังนี้</p>
<pre>CREATE TABLE test_load (
 id     INTEGER UNSIGNED AUTO_INCREMENT,
 dat1   INTEGER UNSIGNED,
 dat2   INTEGER UNSIGNED,
 PRIMARY KEY(id)
);</pre>
<p>ส่วนไฟล์ข้อมูลที่เราจะโหลดทั้งหมด 10,000 บรรทัด มีสองฟิลด์คั่นด้วยเครื่องหมาย comma &#8220;,&#8221; ตัวอย่างไฟล์เป็นดังนี้</p>
<pre>[user@db-server ~]$ <strong>cat data.txt
</strong>2436,156
1732,9161
3016,49
1833,963
5430,434
2092,3929
5430,444
4123,120
...</pre>
<h4>เปิดไฟล์ วนลูป แล้ว INSERT ข้อมูล</h4>
<p>ตัวอย่างโปรแกรม PHP ที่เปิดไฟล์  วนลูปทีละบรรทัด แล้ว INSERT ข้อมูลลง MySQL</p>
<pre>&lt;?php</pre>
<pre>// connect database
mysql_connect("localhost", "db_user", "db_pass");
mysql_select_db("test");</pre>
<pre>$fname  = $argv[1];</pre>
<pre>// open file
$fh = fopen($fname, "r");</pre>
<pre>while ( $fline = fgetcsv($fh, "4096", ",") ) {
    $_dat1 = $fline[0];
    $_dat2 = $fline[1];</pre>
<pre>    // loop insert data
    $db_sql = "INSERT INTO test_load ( dat1, dat2 )  VALUES ( '$_dat1', '$_dat2' );";
    $db_res = mysql_query($db_sql) or die($db_sql);</pre>
<pre>}</pre>
<pre>fclose($fh);
?&gt;</pre>
<p>รันโปรแกรม และใช้คำสั่ง time เพื่อจับเวลาที่ใช้ในการรัน</p>
<pre>[user@db-server ~]$ <strong>time php insert-data.php data.txt</strong></pre>
<pre><span style="color: #0000ff;"><strong>real    0m0.898s
</strong></span>user    0m0.100s
sys     0m0.564s</pre>
<h4>ใช้คำสั่ง LOAD DATA INFILE</h4>
<p>รูปแบบการใช้คำสั่ง LOAD DATA INFILE มีดังนี้</p>
<pre><strong>LOAD DATA</strong> [LOW_PRIORITY | CONCURRENT] [<strong>LOCAL</strong>] <strong>INFILE 'file_name'
</strong>    [REPLACE | IGNORE]
<strong>    INTO TABLE tbl_name
</strong>    [CHARACTER SET charset_name]
    [{<strong>FIELDS</strong> | COLUMNS}
        [<strong>TERMINATED BY 'string'</strong>]
        [[OPTIONALLY] ENCLOSED BY 'char']
        [ESCAPED BY 'char']
    ]
    [LINES
        [STARTING BY 'string']
        [TERMINATED BY 'string']
    ]
    [IGNORE number LINES]
    [<strong>(col_name_or_user_var,...)</strong>]
    [SET col_name = expr,...]</pre>
<p>คำอธิบายการใช้คำสั่งโดยย่อ</p>
<ul>
<li>INFILE &#8216;file_name&#8217; ระบุว่าโหลดจากไฟล์ไหน </li>
<li>INTO TABLE tbl_name  ระบุชื่อ table ที่จะโหลดข้อมูลลง</li>
<li>FIELDS TERMINATED BY &#8216;string&#8217;  แต่ละฟิลด์คั่นด้วยเครื่องหมายอะไร</li>
<li>(col_name_or_user_var,&#8230;) ในกรณีที่โหลดไม่ครบทุกฟิลด์ตามโครงสร้างของ table ต้องมีการระบุด้วยว่าโหลดใส่ชื่อฟิลด์อะไรบ้างตามลำดับ</li>
</ul>
<p>ตัวอย่างการเขียนโปรแกรม เพื่อโหลดข้อมูลจากไฟล์ ลง table ชื่อ test_load แต่ละฟิลด์คั่นด้วยเครื่องหมาย &#8220;,&#8221; และโหลดเฉพาะฟิลด์ที่ชื่อ dat1, dat2 ตามลำดับ</p>
<pre>&lt;?php</pre>
<pre>// connect database
mysql_connect("localhost", "db_user", "db_pass");
mysql_select_db("test");</pre>
<pre>$fname  = $argv[1];</pre>
<pre>// load data
$db_sql = "LOAD DATA LOCAL INFILE '$fname' INTO TABLE test_load
             FIELDS TERMINATED BY ',' ( dat1, dat2 );";
$db_res = mysql_query($db_sql) or die($db_sql);</pre>
<pre>?&gt;</pre>
<p>รันโปรแกรมเพื่อโหลดข้อมูลลง MySQL ใช้คำสั่ง time เพื่อจับเวลาที่ใช้ในการรันโปรแกรม</p>
<pre>[user@db-server ~]$ <strong>time php load-data.php data.txt</strong></pre>
<pre><strong><span style="color: #0000ff;">real    0m0.117s
</span></strong>user    0m0.054s
sys     0m0.023s</pre>
<p>สังเกตว่าเวลาที่ใช้ในการรันเพื่อโหลดข้อมูลด้วย LOAD DATA INFILE เร็วกว่าการ เปิดไฟล์และวนลูปมาก</p>
<h4>ข้อมูลอ้างอิง</h4>
<ul>
<li><a href="http://dev.mysql.com/doc/refman/5.1/en/load-data.html" target="_blank">MySQL 5.1 Reference Manual :: 12.2.6 LOAD DATA INFILE Syntax</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://spalinux.com/2009/08/mysql_load_data_infile/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>ติดตั้ง Cacti บน Fedora 11 ตอนที่ 3</title>
		<link>http://spalinux.com/2009/07/install_cacti_on_fedora_11_part_3</link>
		<comments>http://spalinux.com/2009/07/install_cacti_on_fedora_11_part_3#comments</comments>
		<pubDate>Sat, 18 Jul 2009 09:52:26 +0000</pubDate>
		<dc:creator>editor</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Database]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Networking]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[SNMP]]></category>
		<category><![CDATA[install cacti]]></category>

		<guid isPermaLink="false">http://spalinux.com/?p=874</guid>
		<description><![CDATA[ขั้นตอนนี้จะเป็นการคอนฟิก Cacti ผ่านหน้าเว็บ ซึ่งเป็นค่าคอนฟิกต่างๆ ที่ใช้รัน   เลือกชนิดการติดตั้ง ถ้าเป็นการติดตั้งใหม่ เลือกเป็น &#8220;New Install&#8221;   หน้าเว็บจะแสดงโปรแกรมต่างๆ ที่ Cacti เรียกใช้ หากมีครบทุกอย่างก็สามารถกดปุ่ม [Finish] ได้      การล็อกอินครั้งแรก ใส่ User Name เป็น &#8220;admin&#8221; โดยไม่ต้องใส่ Password    เพื่อความปลอดภัย ในการล็อกอินครั้งแรก โปรแกรม Cacti จะบังคับให้เปลียน Password   หลังจากล็อกอินเรียบร้อยแล้ว ก็จะขึ้นหน้าเว็บของ Cacti   เปิดการ polling การติดตั้ง cacti โดยใช้ไฟล์ rpm จะติดตั้ง cron สำหรับการ poll data ทุกๆ 5 นาที ไว้ในไฟล์ /etc/cron.d/cacti เพียงแต่โดยดีฟอลต์จะปิดไว้ [...]]]></description>
			<content:encoded><![CDATA[<p>ขั้นตอนนี้จะเป็นการคอนฟิก Cacti ผ่านหน้าเว็บ ซึ่งเป็นค่าคอนฟิกต่างๆ ที่ใช้รัน</p>
<p><span id="more-874"></span></p>
<p><img title="Cacti Web Install - Step 1" src="http://spalinux.com/wp-content/uploads/2009/07/01_cacti_install_step-1.png" alt="Cacti Web Install - Step 1" width="816" height="571" /></p>
<p> </p>
<p>เลือกชนิดการติดตั้ง ถ้าเป็นการติดตั้งใหม่ เลือกเป็น &#8220;New Install&#8221;</p>
<p><img title="Cacti Web Install - Step 2" src="http://spalinux.com/wp-content/uploads/2009/07/02_cacti_install_step-2.png" alt="Cacti Web Install - Step 2" width="816" height="571" /></p>
<p> </p>
<p>หน้าเว็บจะแสดงโปรแกรมต่างๆ ที่ Cacti เรียกใช้ หากมีครบทุกอย่างก็สามารถกดปุ่ม [Finish] ได้ </p>
<p><img class="alignnone size-full wp-image-878" title="Cacti Web Install - Step 3" src="http://spalinux.com/wp-content/uploads/2009/07/03_cacti_install_step-3.png" alt="Cacti Web Install - Step 3" width="816" height="571" /></p>
<p> </p>
<p>  การล็อกอินครั้งแรก ใส่ User Name เป็น &#8220;admin&#8221; โดยไม่ต้องใส่ Password </p>
<p><img title="Cacti - User Login" src="http://spalinux.com/wp-content/uploads/2009/07/04_cacti_user_login.png" alt="Cacti - User Login" width="816" height="571" /></p>
<p> </p>
<p>เพื่อความปลอดภัย ในการล็อกอินครั้งแรก โปรแกรม Cacti จะบังคับให้เปลียน Password</p>
<p><img title="Cacti Forced Password Change" src="http://spalinux.com/wp-content/uploads/2009/07/05_cacti_forced_password_change.png" alt="Cacti Forced Password Change" width="816" height="571" /></p>
<p> </p>
<p>หลังจากล็อกอินเรียบร้อยแล้ว ก็จะขึ้นหน้าเว็บของ Cacti</p>
<p><img title="Cacti Web Console" src="http://spalinux.com/wp-content/uploads/2009/07/06_cacti_web_console.png" alt="Cacti Web Console" width="816" height="571" /></p>
<p> </p>
<h4>เปิดการ polling</h4>
<p>การติดตั้ง cacti โดยใช้ไฟล์ rpm จะติดตั้ง cron สำหรับการ poll data ทุกๆ 5 นาที ไว้ในไฟล์ /etc/cron.d/cacti เพียงแต่โดยดีฟอลต์จะปิดไว้ โดยใส่เครื่องหมาย &#8216;#&#8217; ไว้หน้าบรรทัด</p>
<pre>[root@fc11-64min ~]# <strong>cat /etc/cron.d/cacti
</strong><span style="color: #0000ff;">#</span>*/5 * * * *    cacti   /usr/bin/php /usr/share/cacti/poller.php &gt; /dev/null 2&gt;&amp;1</pre>
<p>ต้องแก้ไขไฟล์นี้โดยเอาเครื่องหมาย &#8216;#&#8217; ออก</p>
<pre>[root@fc11-64min ~]# <strong>cat /etc/cron.d/cacti
</strong>*/5 * * * *    cacti   /usr/bin/php /usr/share/cacti/poller.php &gt; /dev/null 2&gt;&amp;1 </pre>
<h4>ข้อมูลอ้างอิง</h4>
<ul>
<li><a href="http://spalinux.com/2009/07/install_cacti_on_fedora_11_part_1">ติดตั้ง Cacti บน Fedora 11 ตอนที่ 1</a></li>
<li><a href="http://spalinux.com/2009/07/install_cacti_on_fedora_11_part_2">ติดตั้ง Cacti บน Fedora 11 ตอนที่ 2</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://spalinux.com/2009/07/install_cacti_on_fedora_11_part_3/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ติดตั้ง Cacti บน Fedora 11 ตอนที่ 2</title>
		<link>http://spalinux.com/2009/07/install_cacti_on_fedora_11_part_2</link>
		<comments>http://spalinux.com/2009/07/install_cacti_on_fedora_11_part_2#comments</comments>
		<pubDate>Sat, 18 Jul 2009 09:30:56 +0000</pubDate>
		<dc:creator>editor</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Database]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Networking]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[install cacti]]></category>

		<guid isPermaLink="false">http://spalinux.com/?p=863</guid>
		<description><![CDATA[หลังจากติดตั้งไฟล์โปรแกรม cacti เรียบร้อยแล้ว ต้องแก้ไขคอนฟิกไฟล์รวมทั้งสร้าง database เพื่อใช้ในการเก็บข้อมูลของ cacti เองด้วย คอนฟิกเว็บเซิร์ฟเวอร์ในส่วนของ cacti ส่วนแรกคือคอนฟิกของเว็บเซิร์ฟเวอร์ โดยดีฟอลต์จากการติดตั้ง cacti โดยใช้ไฟล์ rpm ของ Fedora 11 จะมีคอนฟิกเว็บในส่วนของ cacti สร้างเป็นไฟล์ชื่อ /etc/httpd/conf.d/cacti.conf [root@fc11-64min ~]# cat /etc/httpd/conf.d/cacti.conf # # Cacti: An rrd based graphing tool # Alias /cacti    /usr/share/cacti &#60;Directory /usr/share/cacti/&#62;         Order Deny,Allow         Deny from all         Allow from 127.0.0.1 &#60;/Directory&#62; ความหมายของคอนฟิกไฟล์ด้านบนคือ ผู้ใช้สามารถเรียกใช้เว็บโปรแกรม cati [...]]]></description>
			<content:encoded><![CDATA[<p>หลังจากติดตั้งไฟล์โปรแกรม cacti เรียบร้อยแล้ว ต้องแก้ไขคอนฟิกไฟล์รวมทั้งสร้าง database เพื่อใช้ในการเก็บข้อมูลของ cacti เองด้วย</p>
<p><span id="more-863"></span></p>
<h4>คอนฟิกเว็บเซิร์ฟเวอร์ในส่วนของ cacti</h4>
<p>ส่วนแรกคือคอนฟิกของเว็บเซิร์ฟเวอร์ โดยดีฟอลต์จากการติดตั้ง cacti โดยใช้ไฟล์ rpm ของ Fedora 11 จะมีคอนฟิกเว็บในส่วนของ cacti สร้างเป็นไฟล์ชื่อ /etc/httpd/conf.d/cacti.conf</p>
<pre>[root@fc11-64min ~]# <strong>cat /etc/httpd/conf.d/cacti.conf
</strong>#
# Cacti: An rrd based graphing tool
#
Alias /cacti    /usr/share/cacti</pre>
<pre>&lt;Directory /usr/share/cacti/&gt;
        Order Deny,Allow
        Deny from all
        Allow from 127.0.0.1
&lt;/Directory&gt;</pre>
<p>ความหมายของคอนฟิกไฟล์ด้านบนคือ ผู้ใช้สามารถเรียกใช้เว็บโปรแกรม cati โดยใส่ path เป็น /cacti เช่น http://&lt;ip-address&gt;/cacti/ แต่ดีฟอลต์จะอนุญาตให้เรียกมาจากเครื่อง ip 127.0.0.1 หรือตัวมันเองเท่านั้น</p>
<p>ถ้าต้องการแก้ไขให้เรียกเว็บ cacti จากเครื่องอื่นได้ ต้องแก้ไขคอนฟิกไฟล์นี้เป็น</p>
<pre>[root@fc11-64min ~]# <strong>cat /etc/httpd/conf.d/cacti.conf
</strong>#
# Cacti: An rrd based graphing tool
#
Alias /cacti    /usr/share/cacti</pre>
<pre>&lt;Directory /usr/share/cacti/&gt;
<span style="color: #0000ff;">        Order Allow,Deny
        Allow from all
</span>&lt;/Directory&gt;</pre>
<p>หลังแก้ไขไฟล์คอนฟิกของเว็บเซิร์ฟเวอร์ ต้องใช้คำสั่ง service เพื่อรีสตาร์ตให้คอนฟิกใหม่มีผล</p>
<pre>[root@fc11-64min Packages]# <strong>service httpd restart
</strong>Stopping httpd:                                            [  OK  ]
Starting httpd:                                            [  OK  ]</pre>
<p>ทดลองเรียกเว็บ cacti ผ่าน web browser</p>
<p><img title="01 - Cannot connect database" src="http://spalinux.com/wp-content/uploads/2009/07/01-cacti-error-cannot-conne.png" alt="01 - Cannot connect database" width="816" height="255" /></p>
<h4>สร้างฐานข้อมูลของ cacti</h4>
<p>จากตัวอย่างด้านบน มี error เกิดขึ้น ยังไม่สามารถใช้งานได้</p>
<pre><span style="color: #ff0000;">FATAL: Cannot connect to MySQL server on 'localhost'. Please make sure you have specified a valid MySQL database name in 'include/config.php'</span></pre>
<p>คือต้องสร้าง user, database และ table สำหรับเก็บข้อมูลของ cacti ใน MySQL ก่อน</p>
<p>คอนฟิกของ cacti ในส่วน database จะถูกเก็บอยู่ในไฟล์ /etc/cacti/db.php</p>
<pre>[root@fc11-64min ~]# <strong>cat /etc/cacti/db.php
</strong>&lt;?php
...
/* make sure these values refect your actual database/host/user/password */
$database_type = "mysql";
$database_default = "cacti";
$database_hostname = "localhost";
$database_username = "cactiuser";
$database_password = "cactiuser";
$database_port = "3306";</pre>
<pre>/* Default session name - Session name must contain alpha characters */
#$cacti_session_name = "Cacti";</pre>
<pre>?&gt;</pre>
<p><strong>หมายเหตุ </strong>ในที่นี้จะสร้าง database และ user ตามค่าดีฟอลต์เลย ซึ่งเหมาะสำหรับการทดสอบเพื่อเรียนรู้โปรแกรม cacti แต่ถ้านำไปใช้จริง production แนะนำให้เปลี่ยนค่าตัวแปรเหล่านี้เพื่อความปลอดภัย</p>
<p>ขั้นแรกต้องสร้าง database ให้ cacti ก่อน โดยสร้างชื่อตามตัวแปร $database_default</p>
<p>ในที่นี้จะใช้คำสั่ง mysql สร้างเลย คุณสามารถใช้โปรแกรมอื่นๆ ได้เช่น phpmyadmin</p>
<pre>[root@fc11-64min ~]# <strong>mysql -u root -p
</strong>Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 140
Server version: 5.1.32 Source distribution</pre>
<pre>Type 'help;' or '\h' for help. Type '\c' to clear the buffer.</pre>
<pre>mysql&gt; <strong>CREATE DATABASE <span style="color: #0000ff;">cacti</span>;
</strong>Query OK, 1 row affected (0.00 sec)</pre>
<pre>mysql&gt;</pre>
<p>ขั้นต่อไปต้องสร้าง user และ password สำหรับการเชื่อมเข้า database ตามค่าตัวแปร $database_username, $database_password</p>
<pre>mysql&gt; <strong>GRANT ALL ON cacti.* TO <span style="color: #0000ff;">cactiuser </span>IDENTIFIED BY '<span style="color: #0000ff;">cactiuser</span>';
</strong>Query OK, 0 rows affected (0.09 sec)</pre>
<pre>mysql&gt; <strong>quit
</strong>Bye</pre>
<h4>สร้าง table ใน cacti database</h4>
<p>สุดท้ายต้องสร้าง table ต่างๆ เพื่อเก็บค่าของ cacti โดยสามารถใช้ไฟล์โครงสร้าง table ที่ติดตั้งมาให้อยู่แล้วใน /usr/share/doc/cacti-0.8.7d/cacti.sql</p>
<pre>[root@fc11-64min ~]# <strong>cat /usr/share/doc/cacti-0.8.7d/cacti.sql | mysql -u cactiuser -p cacti
</strong>Enter password:
[root@fc11-64min ~]#</pre>
<p>ทดลองใช้ user ที่สร้างขึ้นเข้า database</p>
<pre>[root@fc11-64min ~]# <strong>mysql -u cactiuser -p
</strong>Enter password:</pre>
<pre>Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 142
Server version: 5.1.32 Source distribution</pre>
<pre>Type 'help;' or '\h' for help. Type '\c' to clear the buffer.</pre>
<pre>mysql&gt; <strong>SHOW DATABASES;
</strong>+--------------------+
| Database           |
+--------------------+
| information_schema |
| <strong><span style="color: #0000ff;">cacti</span></strong>              |
+--------------------+
2 rows in set (0.08 sec)</pre>
<pre>mysql&gt; <strong>CONNECT cacti;
</strong>Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A</pre>
<pre>Connection id:    149
Current database: cacti</pre>
<pre>mysql&gt; <strong>SHOW TABLES;
</strong>+---------------------------+
| Tables_in_cacti           |
+---------------------------+
| cdef                      |
| cdef_items                |
| colors                    |
| data_input                |
| data_input_data           |
| data_input_fields         |
| data_local                |
| data_template             |
| data_template_data        |
| data_template_data_rra    |
| data_template_rrd         |
| graph_local               |
| graph_template_input      |
| graph_template_input_defs |
| graph_templates           |
| graph_templates_gprint    |
| graph_templates_graph     |
| graph_templates_item      |
| graph_tree                |
| graph_tree_items          |
| host                      |
| host_graph                |
| host_snmp_cache           |
| host_snmp_query           |
| host_template             |
| host_template_graph       |
| host_template_snmp_query  |
| poller                    |
| poller_command            |
| poller_item               |
| poller_output             |
| poller_reindex            |
| poller_time               |
| rra                       |
| rra_cf                    |
| settings                  |
| settings_graphs           |
| settings_tree             |
| snmp_query                |
| snmp_query_graph          |
| snmp_query_graph_rrd      |
| snmp_query_graph_rrd_sv   |
| snmp_query_graph_sv       |
| user_auth                 |
| user_auth_perms           |
| user_auth_realm           |
| user_log                  |
| version                   |
+---------------------------+
48 rows in set (0.00 sec)</pre>
<pre>mysql&gt; <strong>quit</strong>
Bye
[root@fc11-64min ~]#</pre>
<p>เปิด web browser อีกครั้ง เรียกไปที่ http://&lt;ip-address&gt;/cacti/ หน้าจอจะ redirect ไปยังหน้าสำหรับการติดตั้งต่อไป</p>
<p><img title="Cacti Installation Guide" src="http://spalinux.com/wp-content/uploads/2009/07/02-cacti-installation-guide.png" alt="Cacti Installation Guide" width="816" height="571" /></p>
<p> </p>
<h4>ข้อมูลอ้างอิง</h4>
<ul>
<li><a href="http://spalinux.com/2009/07/install_cacti_on_fedora_11_part_1">ติดตั้ง Cacti บน Fedora 11 ตอนที่ 1</a></li>
<li><a href="http://spalinux.com/2009/07/install_cacti_on_fedora_11_part_3">ติดตั้ง Cacti บน Fedora 11 ตอนที่ 3</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://spalinux.com/2009/07/install_cacti_on_fedora_11_part_2/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

