Mysql

Mysql

12 items(1/2) 2 Next » Last »|

Update table with incremented value grouped by column

โดย Little Bear on 4 พ.ค. 60 21:43

ต้องการให้สร้างลำดับของ sorder ของข้อมูลในกลุ่มที่มีค่า tpid เดียวกัน โดยเริ่มนับ sorder จาก 1 เป็นต้นไป และเริ่มนับ 1 ใหม่เมื่อเปลี่ยนค่า tpid

SET @f := null, @i = null;
UPDATE `jobtr`
SET
    sorder = IF(tpid = @f, @i := @i+1, @i := 1),
    tpid = (@f := tpid)
ORDER BY tpid, sorder, jobtrid;

ย้ายบ้านให้ MySql

โดย Little Bear on 3 ม.ค. 57 14:42

วันนี้เกิดเหตุ wintesla2003.com หยุดทำงาน โชคดีที่สั่ง reboot ผ่าน DA แล้วสามารถเข้าใช้ ssh ได้ (หลังจากที่เข้า ssh ไม่ได้มาเป็นปี ก็ยังงงอยู่ว่ามันเข้าได้ยังไง โชคดีก็คือไม่ต้องวิ่งไปที่ IDC)

หลังจาก reboot ก็ยังใช้งานไม่ได้ ขณะกำลังหาสาเหตุ ก็นึกได้ว่า server นี้เคยมีปัญหากับ MySql มาครั้งนึงแล้ว คือ partition ที่เก็บข้อมูลเต็ม พอลอง df ดูก็ปรากฎว่าเต็มอีกแล้วจริง ๆ ด้วย

หลังจากลองย้ายบาง folder ออกไป ก็สามารถใช้งานได้ แต่มีบางตารางเสียหาย เลยสั่ง repair ปรากฎว่าเดี้ยงอีก เต็มอีกเหมือนเดิม

เลยตัดสินใจ "ย้ายบ้าน MySql ไปไว้อีก partition"

คำสั่ง

cd /home
mkdir mysql
chown mysql:mysql mysql
cd mysql

perl -pi -e 's/mysqld=ON/mysqld=OFF/' /usr/local/directadmin/data/admin/services.status
/sbin/service mysqld stop

cp -Rp /var/lib/mysql/* .
cd /var/lib
mv mysql mysql_old
ln -s /home/mysql ./mysql

/sbin/service mysqld start
perl -pi -e 's/mysqld=OFF/mysqld=ON/' /usr/local/directadmin/data/admin/services.status

#once satisfied that mysqld is running and functioning correctly, remove the old data:

rm -rf mysql_old

ประมาณนี้ (แต่ผมไม่ได้ทำตามนี้เป๊ะ ๆ) คือ ย้ายข้อมูลไปไว้ใน /home แล้วทำ link จาก /var/lib/mysql ให้ชี้ไปที่ /home/mysql

ที่มา directadmin.com

UPDATE multiple tables in MySQL using LEFT JOIN

โดย Little Bear on 22 มิ.ย. 56 00:46

มีปัญหาที่จะต้อง update บางฟิลด์ของฐานข้อมูล แต่ขั้นตอนการตรวจสอบจะต้องเชื่อมโยง (join) กับอีกตารางด้วย ทีแรกกะว่าคงต้องเขียนโปรแกรมตรวจสอบ แล้วค่อยอัพเดทเสียกระมัง แต่ทว่า... ลอง google เสียหน่อยก่อนเป็นไร ก็เลยเจอกับ

UPDATE t1
LEFT JOIN t2 ON t2.some_id = t1.some_id
LEFT JOIN t3 ON t2.t3_id = t3.id
SET t1.new_column = t3.column;

สบายไป

ที่มา stackoverflow.com

Column value swap

โดย Little Bear on 17 พ.ค. 56 19:16

UPDATE swap_test SET x=(@temp:=x), x = y, y = @temp;

my.cnf

โดย Little Bear on 15 ม.ค. 56 20:10

คุณ icez เขียนไว้ที่ www.thaihosttalk.com ว่า

maxclients ของ apache สูตรคำนวณคือแรมหาร 50 ครับ แรม 24GB ก็เซตประมาณ 480 - 512 ไม่เกินนั้น

ส่วนของ my.cnf นี่บอกยากครับ หลักๆ ใช้ความรู้สึกเอามากกว่า

ด้านล่างนี้เป็นค่าเฉลี่ยสำหรับเครื่อง hosting ที่มีแรมมากกว่า 8GB ครับ ค่าที่ยังปรับเพิ่มได้อีกมี keybuffers กับ innodbbufferpoolsize นอกนั้นไม่ควรปรับเพิ่ม (max connections ปรับเพิ่มได้แต่ไม่เกิน 500 แต่ไม่แนะนำให้ปรับโดยเด็ดขาด)

[mysqld]
local-infile=0

innodb_buffer_pool_size=256M
innodb_additional_mem_pool_size=1M
innodb_log_buffer_size=500K
innodb_thread_concurrency=2
innodb_file_per_table

skip-character-set-client-handshake
skip-name-resolve
max_connections = 300
key_buffer = 512M
myisam_sort_buffer_size = 32M
join_buffer_size = 1M
read_buffer_size = 1M
sort_buffer_size = 2M
read_rnd_buffer_size = 1M

table_cache = 1536
thread_cache = 4
thread_concurrency = 2
thread_cache_size = 256
wait_timeout = 3600
connect_timeout = 10
max_tmp_tables = 256
tmp_table_size = 128M
max_allowed_packet = 16M
max_connect_errors = 10
query_cache_limit = 1M
query_cache_size = 32M
query_cache_type = 1
query_prealloc_size = 16384
query_alloc_block_size = 16384
max_heap_table_size = 128M

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
open_files_limit = 16384

Make Ubuntu to be a web server (LAMP)

โดย Little Bear on 21 มิ.ย. 54 12:33

ติดตั้ง Ubuntu Desktop ให้เป็น Server (LAMP)

ผ่านไป 2 ปี ก็ถึงเวลาต้องติดตั้ง Ubuntu ใหม่เสียที คราวนี้เลยถือโอกาสเปลี่ยนเป็น Ubuntu 11.04 64 bit ไปเลย ก็เลยลองมารีวิวการติดตั้ง LAMP บน Ubuntu ใหม่ว่ามีอะไรที่เปลี่ยนแปลงไปบ้าง

หมายเหตุ : การติดตั้งต่อไปนี้ใช้สิทธิ์ของ root ขอให้เข้าสู่สิทธิ์ของ root โดยการเปิด terminal แล้วพิมพ์ sudo su

Install L.A.M.P Stack (Apache, Mysql, PHP) ทีเดียวซะเลย

root@god:/# apt-get install lamp-server^

แล้วก็ลง phpMyAdmin

root@god:/# apt-get install phpmyadmin

เลือก Apache แล้ว YES สำหรับ dbconfig-common.

ติดตั้งเพิ่มเติม

php5-curl

root@god# apt-get install php5-curl

หรือชอบที่จะลงทีละตัว ก็

Install Apache

root@god:/# apt-get install apache2

Enable mod_rewrite

root@god:/# a2enmod rewrite

เปลี่ยน DocumentRoot ของ apache เป็น folder อื่น และเปิดใช้งาน clean url

root@god:/# nano /etc/apache2/sites-available/default
  • เปลี่ยนบรรทัด /var/www/ เป็น /my web folder/ จำนวน 2 ตำแหน่ง
  • แก้ค่า AllowOverride ของ /my web folder/ จาก None เป็น AllowOverride All

Install PHP

root@god:/# apt-get install php5 libapache2-mod-php5 php5-gd
root@god:/# /etc/init.d/apache2 restart

Install MySQL

root@god:/# apt-get install mysql-server libapache2-mod-auth-mysql php5-mysql phpmyadmin
root@god:/# /etc/init.d/apache2 restart

หากมีข้อมูลเก่าของ mysql ก็สามารถ copy มาไว้ที่ /var/lib/mysql แล้ว โดยใช้คำสั่ง

root@god:/# cp /media/disk/var/lib/mysql/* /var/lib/mysql/
root@god:/# chown -hR mysql /var/lib/mysql/*
root@god:/# chgrp -hR mysql /var/lib/mysql/*

ย้ายข้อมูล mysql ไปไว้ที่อื่น

root@god:/# /etc/init.d/mysql stop
root@god:/# mkdir /home/mysql
root@god:/# chown -R mysql:mysql /home/mysql
root@god:/# cp -r /var/lib/mysql/mysql /home/mysql/
root@god:/# chown -R mysql:mysql /home/mysql/*

แล้วแก้ my.cnf

root@god:/# nano /etc/mysql/my.cnf

หาคำนี้ให้เจอ :

datadir = /var/lib/mysql

แล้วเปลี่ยนเป็นตำแหน่งใหม่ :

datadir = /home/mysql

เสร็จแล้วก็ restart mysql service

root@god:/# /etc/init.d/mysql start
Starting MySQL database server mysqld [ OK ]

แล้ว mysql จะทำการสร้างไฟล์ ibdata1, ib_logfile0, อื่น ๆ ขึ้นมาใหม่

ทุกอย่างน่าจะเรียบร้อย แต่ผมไม่สามารถ start mysql ได้ มันค้างอยู่ เลยต้องไปแก้ค่าในไฟล์ /etc/apparmor.d/usr.sbin.mysqld โดยเปลี่ยนค่า /var/lib/mysql ให้เป็น /home/mysql ด้วย

แล้วคราวนี้ก็ทำการ copy ฐานข้อมูลเก่า ๆ มาได้เลย อย่าลืมเปลี่ยน owner/group เป็น mysql ด้วยนะ

ที่มา

#sudo apt-get install apache2 apache2-doc apache2-mpm-prefork apache2-utils libexpat1 ssl-cert
#sudo apt-get install libapache2-mod-php5 php5 php5-common php5-curl php5-dev php5-gd php5-idn php-pear php5-imagick php5-imap php5-json php5-mcrypt php5-memcache php5-mhash php5-ming php5-mysql php5-ps php5-pspell php5-recode php5-snmp php5-sqlite php5-tidy php5-xmlrpc php5-xsl

Geometric - เก็บพิกัดกันยังไง เรื่องที่ผมยังไม่รู้

โดย Little Bear on 1 ส.ค. 53 12:27

สงสัยอยู่นานแล้วว่า คนอื่นเขาเก็บพิกัดละติจูด ลองกิจูดกันยังไง เก็บเป็น text เป็น numeric แยกฟิลด์ไหม ลองเก็บมาหลายรูปแบบจนเริ่มมั่ว ก็เลยลองหาดูว่าคนอื่นเขาเก็บค่าพิกัดกันอย่างไร

เลยเห็น MySql data typa ตัวใหม่ คือ SPATIAL ซึ่งจะเก็บเป็น GEOMETRY , POINT , LINESTRING , MULTIPOINT, MULTILINESTRING , MULTIPOLYGON , GEOMETRYCOLLECTION

เริ่มเข้าเค้า งั้นเลยลองเก็บแบบนี้ดู เห็นบอกว่าสามารถคำนวณพิกัด ระยะทาง ได้เลย

ลองสร้างตารางดู

CREATE TABLE `place` (
  `name` varchar(100) DEFAULT NULL,
  `location` point DEFAULT NULL,
  PRIMARY KEY (`name`)
) ENGINE=MyISAM;

เวลา add record ต้องระบุ location เป็น POINT(7.10,100.6) เช่น

INSERT INTO `place` (`name`,`location`)
 VALUES
 ("สงขลา",PointFromText("POINT(7.122219 100.59288)"));

เวลา query ก็ใช้

SELECT `name`,AsText(`location`),X(location),Y(`location`)
 FROM `place`;

แหล่งเรียนรู้

Reset password root ใน mysql

โดย Little Bear on 21 ก.ย. 52 12:11

ปัญหาการลืม password เป็นเรื่องปกติ เนื่องจากเราชักจะมี password มากเกินไปเสียแล้ว และยังหาวิธีการดี ๆ ที่มีความปลอดภัยในการจำรหัสไม่ได้เสียที จะจดไว้ในสมุด ก็มีคนบอกว่าห้าม จะให้จำ ก็จำไม่หมด

เอาเป็นว่า กรณีของ MySql หากเราลืมรหัสของ root ก็เข้าไป reset หรือ ตั้งรหัสใหม่ก็แล้วกัน ขอบันทึกวิธีการ reset password ไว้กันลืม (ก่อนจะลืมวิธีการ reset password อีก)

วิธีการ reset password ของ MySql คือ

  1. หยุดการทำงานของ mysql ก่อน

    # /etc/init.d/mysql stop

  2. Start MySQL เป็น save mode. โดยคำสั่ง

    # mysqld_safe –skip-grant-tables &

  3. Login MySQL โดย user root

    # mysql -u root

  4. Update password root (ใสรหัสใหม่แทน NEW PASSWORD)

    mysql> use mysql;
    mysql> update user set password=PASSWORD(”NEW PASSWORD”) where user=’root’;
    mysql> flush privileges;
    mysql> quit;
    

  5. Restart service ของ mysql ก็เป็นอันว่าเรียบร้อย

    #/etc/init.d/mysql restart

  6. แล้วลองเข้าใหม่ดูครับ

    # mysql -u root -p

ที่มา SnappyTux

Sql injection

โดย Little Bear on 9 ส.ค. 52 12:59

การโจมตีด้วยวิธี Sql injection อาจทำให้ข้อมูลของเว็บหายทั้งหมดได้ เคยลองกับเว็บของผมดูแล้ว ซึ่งน่าจะป้องกันได้ (แต่ไม่รู้ว่าได้หมดหรือเปล่า) วันนี้เลยเก็บบทความที่พูดถึงเรื่องนี้ไว้ศึกษาดู

  • http://dev.mysql.com/tech-resources/articles/guide-to-php-security-ch3.pdf
  • http://shiflett.org/articles/sql-injection
  • http://shiflett.org/blog/2006/jan/addslashes-versus-mysql-real-escape-string

และจะได้ทดสอบทั้งระบบดูว่าจะโดนโจมตีด้วยวิธีนี้ได้หรือไม่

MySQL / PHPMyAdmin - Export Table to Server

โดย Little Bear on 18 มิ.ย. 52 03:27

แก้ไขไฟล์ config.inc.php

$cfg['SaveDir']= '/tmp';

เพิ่มบรรทัด

$GLOBALS["saveonserver"]=true;

แล้วจะมีปุ่มให้คลิก Save on server in /tmp/ directory ตอน export

ปล. มีเวลาจะมาอธิบายอย่างละเอียดอีกที

ที่มา : www.planet-source-code.com

12 items(1/2) 2 Next » Last »|