[mysqld]
user=mysql
bind-address=127.0.0.1
datadir=/var/lib/mysql
pid-file=/var/run/mysqld/mysqld.pid
socket=/var/run/mysql/mysql.sock
port=3306
tmpdir=/tmp
language=/usr/share/mysql/english
skip-external-locking
query_cache_limit=64M
query_cache_size=32M
query_cache_type=1
max_connections=15
max_user_connections=300
interactive_timeout=100
wait_timeout=100
connect_timeout=10
thread_stack=128K
thread_cache_size=128
myisam-recover=BACKUP
key_buffer=64M
join_buffer=1M
max_allowed_packet=32M
table_cache=512M
sort_buffer_size=1M
read_buffer_size=1M
read_rnd_buffer_size=768K
max_connect_errors=10
thread_concurrency=4
myisam_sort_buffer_size=32M
skip-locking
skip-bdb
expire_logs_days=10
max_binlog_size=100M
server-id=1
[mysql.server]
user=mysql
basedir=/usr
[safe_mysqld]
bind-address=127.0.0.1
err-log=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
open_files_limit=8192
SAFE_MYSQLD_OPTIONS=”–defaults-file=/etc/my.cnf –log-slow-queries=/var/log/slow-queries.log”
[mysql]
[isamchk]
key_buffer=64M
sort_buffer=64M
read_buffer=16M
write_buffer=16M
[myisamchk]
key_buffer=64M
sort_buffer=64M
read_buffer=16M
write_buffer=16M
[mysqlhotcopy]
interactive-timeout
max_heap_table_size = 64 M
tmp_table_size = 64 M
!includedir /etc/mysql/conf.d/I’ve gone back and forth over the years configuring MySQL for optimal performance, and while I know I’m not there, I now have a new baseline to build from. From a post called Standard MYSQL my.cnf configuration, you can see all the base information, but also things like:
key_buffer=256M # 64M for 1GB, 128M for 2GB, 256 for 4GBWhich defines the value (256M) but then spells out ideal base values for you to start with if you have more RAM on your system. This is very helpful, I’m tried to go a step further by combining it with Debian’s default my.cnf that comes on 5.0 (lenny) for MySQL 5. As I’m always open for suggestions for improvements, please comment if you have a different view on these choices, thanks. Here it is:
[client]
socket=/var/run/mysqld/mysqld.sock
port=3306
[mysqld_safe]
socket=/var/run/mysqld/mysqld.sock
nice=0
[mysqld]
user=mysql
bind-address=127.0.0.1
datadir=/var/lib/mysql
pid-file=/var/run/mysqld/mysqld.pid
socket=/var/run/mysql/mysql.sock
port=3306
tmpdir=/tmp
language=/usr/share/mysql/english
skip-external-locking
query_cache_limit=1M
query_cache_size=32M
query_cache_type=1
max_connections=3000
max_user_connections=600
interactive_timeout=100
wait_timeout=100
connect_timeout=10
thread_stack=128K
thread_cache_size=128
myisam-recover=BACKUP
#key_buffer - 64M for 1GB, 128M for 2GB, 256 for 4GB
key_buffer=64M
#join_buffer_size - 1M for 1GB, 2M for 2GB, 4M for 4GB
join_buffer=1M
max_allowed_packet=32M
table_cache=1024
#sort_buffer_size - 1M for 1GB, 2M for 2GB, 4M for 4GB
sort_buffer_size=1M
#read_buffer_size - 1M for 1GB, 2M for 2GB, 4M for 4GB
read_buffer_size=1M
#read_rnd_buffer_size - 768K for 1GB, 1536K for 2GB, 3072K for 4GB
read_rnd_buffer_size=768K
max_connect_errors=10
thread_concurrency=4
#myisam_sort_buffer_size - 32M for 1GB, 64M for 2GB, 128 for 4GB
myisam_sort_buffer_size=32M
skip-locking
skip-bdb
expire_logs_days=10
max_binlog_size=100M
server-id=1
[mysql.server]
user=mysql
basedir=/usr
[safe_mysqld]
bind-address=127.0.0.1
err-log=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
open_files_limit=8192
SAFE_MYSQLD_OPTIONS=”–defaults-file=/etc/my.cnf –log-slow-queries=/var/log/slow-queries.log”
#[mysqldump]
#quick
#quote-names
#max_allowed_packet=16M
[mysql]
#no-auto-rehash # faster start of mysql but no tab completition
[isamchk]
#key_buffer - 64M for 1GB, 128M for 2GB, 256M for 4GB
key_buffer=64M
#sort_buffer - 64M for 1GB, 128M for 2GB, 256M for 4GB
sort_buffer=64M
#read_buffer - 16M for 1GB, 32M for 2GB, 64M for 4GB
read_buffer=16M
#write_buffer - 16M for 1GB, 32M for 2GB, 64M for 4GB
write_buffer=16M
[myisamchk]
#key_buffer - 64M for 1GB, 128M for 2GB, 256M for 4GB
key_buffer=64M
#sort_buffer - 64M for 1GB, 128M for 2GB, 256M for 4GB
sort_buffer=64M
#read_buffer - 16M for 1GB, 32M for 2GB, 64M for 4GB
read_buffer=16M
#write_buffer - 16M for 1GB, 32M for 2GB, 64M for 4GB
write_buffer=16M
[mysqlhotcopy]
interactive-timeout
!includedir /etc/mysql/conf.d/
Showing posts with label MSSQL. Show all posts
Showing posts with label MSSQL. Show all posts
7/11/2011
9/22/2010
Mysql query command
-Use regular expressions in MySQL SELECT statements :
MySQL allows the following regular expression metacharacters
. match any character
? match zero or one
* match zero or more
+ match one or more
{n} match n times
{m,n} match m through n times
{n,} match n or more times
^ beginning of line
$ end of line
[[:<:]] match beginning of words [[:>:]] match ending of words
[:class:] match a character class
i.e., [:alpha:] for letters
[:space:] for whitespace
[:punct:] for punctuation
[:upper:] for upper case letters
[abc] match one of enclosed chars
[^xyz] match any char not enclosed
| separates alternatives
Etc.
SELECT * FROM events WHERE id REGEXP '5587$'
SELECT * FROM reviews WHERE description REGEXP '[[:<:]]excellent[[:>:]]'
SELECT something FROM table WHERE column REGEXP 'regexp'
-Describe the column structure of a MySQL table :
describe tablename;
-Display a list of databases on a MySQL server :
show databases;
-Change the MySQL root user password :
#mysqladmin -u root password PaSsWoRd
MySQL allows the following regular expression metacharacters
. match any character
? match zero or one
* match zero or more
+ match one or more
{n} match n times
{m,n} match m through n times
{n,} match n or more times
^ beginning of line
$ end of line
[[:<:]] match beginning of words [[:>:]] match ending of words
[:class:] match a character class
i.e., [:alpha:] for letters
[:space:] for whitespace
[:punct:] for punctuation
[:upper:] for upper case letters
[abc] match one of enclosed chars
[^xyz] match any char not enclosed
| separates alternatives
Etc.
SELECT * FROM events WHERE id REGEXP '5587$'
SELECT * FROM reviews WHERE description REGEXP '[[:<:]]excellent[[:>:]]'
SELECT something FROM table WHERE column REGEXP 'regexp'
-Describe the column structure of a MySQL table :
describe tablename;
-Display a list of databases on a MySQL server :
show databases;
-Change the MySQL root user password :
#mysqladmin -u root password PaSsWoRd
tag:
command,
MSSQL,
regexpression,
sql
Mysql Save MySQL query results into a text or CSV file
SELECT order_id,product_name,qty
FROM orders
INTO OUTFILE '/tmp/orders.txt'
or
SELECT order_id,product_name,qty
FROM orders
INTO OUTFILE '/tmp/orders.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
Import CSV file directly into MySQL
load data local infile 'uniq.csv' into table tblUniq
fields terminated by ','
enclosed by '"'
lines terminated by '\n'
(uniqName, uniqCity, uniqComments)
FROM orders
INTO OUTFILE '/tmp/orders.txt'
or
SELECT order_id,product_name,qty
FROM orders
INTO OUTFILE '/tmp/orders.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
Import CSV file directly into MySQL
load data local infile 'uniq.csv' into table tblUniq
fields terminated by ','
enclosed by '"'
lines terminated by '\n'
(uniqName, uniqCity, uniqComments)
9/03/2010
MSSQL : การทำ Performance Tuning SQL Query เบื้องต้น
ตอนนี้ผมจะได้กล่าวถึงสิ่งที่ควรปฏิบัติในการออกแบบ Database ซึ่งส่วนใหญ่จะหนักไปทาง data storage โดยพอจะสรุปเป็นข้อๆ ได้ดังนี้ครับ
1) ใช้ Normalization เพื่อ Optimize Transactional Process
การทำ Normalization นั้น จะช่วยในมุมการใช้คำสั่ง Insert, Update, Delete ครับ ทำให้เกิด Performance ที่ดีครับ แต่จะมีผลตรงกันข้ามกับคำสั่ง Select เพราะว่าใน Database หลายๆ ตัวที่ผมเคยเจออาจจะพบว่า Query เร็ว แต่ Insert ช้าก็ได้ครับ
2) แยกไฟล์ MDF และ LDF ไว้กันคนละ physical disk
โดยคำสั่ง Insert, Update, Delete จะกระทำกับไฟล์ LDF เป็นหลัก ทั้งนี้ในงาน multi-user ขนาดใหญ่แล้วจะเกิด load read-write อยู่บน physical disk ก้อนเดียวกัน ถ้าเป็นไปได้ก็ควรจะแยกไฟล์ MDF และ LDF ไว้คนละ physical disk ก็จะทำให้เกิดการแบ่ง load read-write ไปไว้คนละ physical disk (ผมเคยทำมาหลายงานแล้ว เร็วขึ้นมา 10 เท่าก็เคยเจอครับ)
3) แยก tempdb ไว้บน harddisk ก้อนใหม่
หลักการจะเหมือนกับการแยกไฟล์ MDF และ LDF ครับ คือการแยก load แต่ tempdb จะเป็น temp สำหรับ database ทุกก้อนที่อยู่ใน Server ครับ ลองคิดดูเล่นๆ สิครับว่า tempdb จะรับงานหนักแค่ไหน ถ้าเป็นไปได้ก็ควรแยก tempdb ไว้คนบน physical disk ต่างหากได้จะดีมากครับ
4) สำหรับ table ขนาดใหญ่ให้ใช้ Table partition
การทำ table partition เป็นการแยก load ทาง horizontal โดยจะทำได้ตั้งแต่ sql server 2005 ขึ้นไป เป็นวิธีการกระจาย load ที่ฉลาดมากที่สุดวิธีหนึ่ง โดยสามารถกำหนดเงื่อนไขในการแบ่ง table เช่น แบ่งตามปีที่ซื้อสินค้า, แบ่งตามแผนก เป็นต้น ส่วนวิธีการสร้าง table partition จะไว้เขียนในตอนต่อๆ ไปครับ
5) สำหรับ database ขนาดใหญ่ให้ใช้วิธีการแยกไฟล์ออกเป็นหลายๆ ไฟล์โดยใช้ File Group
หลักการจะเหมือนกับการทำ partition table แต่เป็นระดับ Database แทน โดยการแยก table กระจายไปแต่ละ physical disk แต่วิธีการแยกเราจะใช้ file group ซึ่งสามารถทำได้ทุกเวอร์ชั่นของ SQL Server
6) เมื่อใช้ Data type แบบ TEXT, NTEXT, IMAGE ให้แยกเก็บต่างหากจาก Table Storage
โดยปกติแล้วการเก็บข้อมูลของ column ที่มี data type เป็น text, ntext, image นั้นจะเก็บอยู่ใน page เดียวกับ column อื่นๆ เพราะฉะนั้น เวลาใช้คำสั่ง select ก็จะทำให้ sql server ไปอ่าน column เหล่านี้ขึ้นมาด้วย ซึ่งถือว่าเป็น column ที่พิเศษ ดังนันจึงควรจะทำการแยก column ที่เป็น text, ntext, image แยกออกมาต่างหาก เพื่อเพิ่ม performance โดยใช้คำสั่ง
EXEC sp_tableoption 'orders', 'text in row', 'ON'
7) พยายามใช้ constraint ที่เป้น built-in เช่น primary key, foreign key, check, default, unique แทนการเขียน trigger ขึ้นมาเอง
contraint ต่างๆ ที่มีอยู่แล้ว ทาง microsoft ได้ทำการทดสอบเรื่อง performance มาเป็นอย่างดีอยู่แล้ว พยายามใช้ built-in เป็นหลักเพื่อให้ได้ performance ที่ดี แต่ถ้า built-in ที่มีอยู่ ไม่สามารถตอบสนองสิ่งที่เราต้องการได้จริงๆ ถืงจะเริ่มนึกถึงการเขียน trigger ขึ้นมาใช้งานเองอีกทีนึงครับ
8) แยก Index ไว้คนละ Physical Disk โดยใช้ File Group
การสร้าง index จะทำให้การ access data ทำได้เร็ว แต่ก็ควรที่จะแยก index ไว้คนละ physical disk โดยใช้ file group เหมือนกันครับ รับรองว่าไม่ผิดหวัง
9) ใช้ Disk RAID เพื่อเพิ่ม Performance
สุดท้ายจริงๆ ถ้ามีงบประมาณมากหน่อย ก็อาจจะนึกถึงการซื้อ Hardware RAID Disk ซึ่งจะได้ performance ที่ดีแน่นอน
1) ใช้ Normalization เพื่อ Optimize Transactional Process
การทำ Normalization นั้น จะช่วยในมุมการใช้คำสั่ง Insert, Update, Delete ครับ ทำให้เกิด Performance ที่ดีครับ แต่จะมีผลตรงกันข้ามกับคำสั่ง Select เพราะว่าใน Database หลายๆ ตัวที่ผมเคยเจออาจจะพบว่า Query เร็ว แต่ Insert ช้าก็ได้ครับ
2) แยกไฟล์ MDF และ LDF ไว้กันคนละ physical disk
โดยคำสั่ง Insert, Update, Delete จะกระทำกับไฟล์ LDF เป็นหลัก ทั้งนี้ในงาน multi-user ขนาดใหญ่แล้วจะเกิด load read-write อยู่บน physical disk ก้อนเดียวกัน ถ้าเป็นไปได้ก็ควรจะแยกไฟล์ MDF และ LDF ไว้คนละ physical disk ก็จะทำให้เกิดการแบ่ง load read-write ไปไว้คนละ physical disk (ผมเคยทำมาหลายงานแล้ว เร็วขึ้นมา 10 เท่าก็เคยเจอครับ)
3) แยก tempdb ไว้บน harddisk ก้อนใหม่
หลักการจะเหมือนกับการแยกไฟล์ MDF และ LDF ครับ คือการแยก load แต่ tempdb จะเป็น temp สำหรับ database ทุกก้อนที่อยู่ใน Server ครับ ลองคิดดูเล่นๆ สิครับว่า tempdb จะรับงานหนักแค่ไหน ถ้าเป็นไปได้ก็ควรแยก tempdb ไว้คนบน physical disk ต่างหากได้จะดีมากครับ
4) สำหรับ table ขนาดใหญ่ให้ใช้ Table partition
การทำ table partition เป็นการแยก load ทาง horizontal โดยจะทำได้ตั้งแต่ sql server 2005 ขึ้นไป เป็นวิธีการกระจาย load ที่ฉลาดมากที่สุดวิธีหนึ่ง โดยสามารถกำหนดเงื่อนไขในการแบ่ง table เช่น แบ่งตามปีที่ซื้อสินค้า, แบ่งตามแผนก เป็นต้น ส่วนวิธีการสร้าง table partition จะไว้เขียนในตอนต่อๆ ไปครับ
5) สำหรับ database ขนาดใหญ่ให้ใช้วิธีการแยกไฟล์ออกเป็นหลายๆ ไฟล์โดยใช้ File Group
หลักการจะเหมือนกับการทำ partition table แต่เป็นระดับ Database แทน โดยการแยก table กระจายไปแต่ละ physical disk แต่วิธีการแยกเราจะใช้ file group ซึ่งสามารถทำได้ทุกเวอร์ชั่นของ SQL Server
6) เมื่อใช้ Data type แบบ TEXT, NTEXT, IMAGE ให้แยกเก็บต่างหากจาก Table Storage
โดยปกติแล้วการเก็บข้อมูลของ column ที่มี data type เป็น text, ntext, image นั้นจะเก็บอยู่ใน page เดียวกับ column อื่นๆ เพราะฉะนั้น เวลาใช้คำสั่ง select ก็จะทำให้ sql server ไปอ่าน column เหล่านี้ขึ้นมาด้วย ซึ่งถือว่าเป็น column ที่พิเศษ ดังนันจึงควรจะทำการแยก column ที่เป็น text, ntext, image แยกออกมาต่างหาก เพื่อเพิ่ม performance โดยใช้คำสั่ง
EXEC sp_tableoption 'orders', 'text in row', 'ON'
7) พยายามใช้ constraint ที่เป้น built-in เช่น primary key, foreign key, check, default, unique แทนการเขียน trigger ขึ้นมาเอง
contraint ต่างๆ ที่มีอยู่แล้ว ทาง microsoft ได้ทำการทดสอบเรื่อง performance มาเป็นอย่างดีอยู่แล้ว พยายามใช้ built-in เป็นหลักเพื่อให้ได้ performance ที่ดี แต่ถ้า built-in ที่มีอยู่ ไม่สามารถตอบสนองสิ่งที่เราต้องการได้จริงๆ ถืงจะเริ่มนึกถึงการเขียน trigger ขึ้นมาใช้งานเองอีกทีนึงครับ
8) แยก Index ไว้คนละ Physical Disk โดยใช้ File Group
การสร้าง index จะทำให้การ access data ทำได้เร็ว แต่ก็ควรที่จะแยก index ไว้คนละ physical disk โดยใช้ file group เหมือนกันครับ รับรองว่าไม่ผิดหวัง
9) ใช้ Disk RAID เพื่อเพิ่ม Performance
สุดท้ายจริงๆ ถ้ามีงบประมาณมากหน่อย ก็อาจจะนึกถึงการซื้อ Hardware RAID Disk ซึ่งจะได้ performance ที่ดีแน่นอน
MSSQL : การกู้ข้อมูล SQL ที่ยังไม่ได้ Backup ด้วย Tail Log
สำหรับท่านที่ดูแลฐานข้อมูล Microsoft SQL Server อยู่ อาจจะเคยประสบปัญหาเกี่ยวกับฐานข้อมูลพังกันมาไม่มากก็น้อยหล่ะครับ ทีนี้เมื่อฐานข้อมูลพัง เราจะทำยังไงดีหล่ะครับ แน่นอน ก็คงจะนึกถึงชุด backup ล่าสุดที่เราได้เคย backup ไว้ แล้วก็พยายามจะ Restore ขึ้นมา แต่ก็เป็นอย่างที่คิดไว้แหล่ะครับ เราก็จะกู้ได้เฉพาะข้อมูลที่เราได้ backup ไปแล้วเท่านั้น ส่วนข้อมูลที่ยังไม่ได้ backup หล่ะ!!!
โครงสร้างของ SQL Database
อย่างที่หลายๆ ท่านทราบกันดีว่าใน 1 sql database จะต้องมีไฟล์ ดังนี้
Data File (.mdf)
Transaction Log File (.ldf)
ในไฟล์ ldf นี่แหล่ะครับ ที่จะยังมี data ที่เรายังไม่ได้ backup อยู่!!!
คำสั่งต่อไปนี้เป็นวิธีการกู้ข้อมูล โดยดึง data ที่อยู่ในไฟล์ ldf ขึ้นมาครับ แต่ต้องมีข้อแม้ว่าไฟล์ ldf จะต้องไม่เสียด้วยนะครับ (ถ้าเสียก็เศร้าหล่ะครับ)
BACKUP LOG AdventureWorks
TO Disk = ‘c:\backup\adv_log.bak’
WITH NO_TRUNCATE;
GO
โครงสร้างของ SQL Database
อย่างที่หลายๆ ท่านทราบกันดีว่าใน 1 sql database จะต้องมีไฟล์ ดังนี้
Data File (.mdf)
Transaction Log File (.ldf)
ในไฟล์ ldf นี่แหล่ะครับ ที่จะยังมี data ที่เรายังไม่ได้ backup อยู่!!!
คำสั่งต่อไปนี้เป็นวิธีการกู้ข้อมูล โดยดึง data ที่อยู่ในไฟล์ ldf ขึ้นมาครับ แต่ต้องมีข้อแม้ว่าไฟล์ ldf จะต้องไม่เสียด้วยนะครับ (ถ้าเสียก็เศร้าหล่ะครับ)
BACKUP LOG AdventureWorks
TO Disk = ‘c:\backup\adv_log.bak’
WITH NO_TRUNCATE;
GO
Subscribe to:
Posts (Atom)