Topic List
Backup table
mysqldump --user=username --password db table1 table2 > file.sql
database exclude
mysqldump --user=username --password --databases db --ignore-table=db.table1 --ignore-table=db.table2 > file.sql
เดิมเคยเก็บโดยการแปลงด้วยคำสั่ง jsonencode แต่มักจะเกิดปัญหาเมื่อมีอักขระบางตัวหรือการขึ้นบรรทัดใหม่ ซึ่งจะทำให้ไม่สามารถแปลงกลับด้วยคำสั่ง jsondecode
แต่....
MySQL version 5.7.8 ได้เพิ่ม JSON data type ให้แล้ว (แม้ว่าเมื่อเลือกเป็น JSON data type แล้ว MySQL ก็จะเก็บเป็น longtext type ก็ตาม)
และมีคำสั่งเฉพาะในการจัดการกับข้อมูล เช่น
JSONOBJECT, JSONARRAY, JSONMERGEPRESERVE, JSONMERGEPATCH, JSONTYPE, JSONEXTRACT, JSONINSERT, JSONREPLACE, JSONSET, JSONREMOVE
JSON-SET:
UPDATEiot
SETdataJson
= JSON-SET(dataJson
, "$.test", "1" ) WHEREnodeDataId
=3
JSON-REPLACE จะบันทึกค่าทับของเดิม แต่หากของเดิมไม่เคยมี key นั้นอยู่ ก็จะไม่มีการบันทึกข้อมูลใหม่ลงไป
JSON-SET จะบันทึกข้อมูลทับของเดิม หากยังไม่เคยมี key นั้นอยู่ ก็จะสร้างเพิ่มให้โดยอัตโนมัติ
ลองดูรายละเอียดได้จาก How To Work with JSON in MySQL
ที่มา
ต้องการให้สร้างลำดับของ 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;
หากไม่ต้องเริ่มต้น group
SET @i = 0; UPDATEusers
SET uid = @i := @i+1 ORDER BYuid
ASC;
วันนี้เกิดเหตุ 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 <a class="hashtag" href="/tags/once">#once</a> 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 บางฟิลด์ของฐานข้อมูล แต่ขั้นตอนการตรวจสอบจะต้องเชื่อมโยง (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
UPDATE swap_test SET x=(@temp:=x), x = y, y = @temp;
คุณ 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
ติดตั้ง 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 ด้วยนะ
ที่มา
- Installing LAMP On Ubuntu For Newbies
- How to move mysql database to another drive or partition
- howtoforge.com
#sudo apt-get install apache2 apache2-doc apache2-mpm-prefork apache2-utils libexpat1 ssl-cert
<a class="hashtag" href="/tags/sudo">#sudo</a> 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
สงสัยอยู่นานแล้วว่า คนอื่นเขาเก็บพิกัดละติจูด ลองกิจูดกันยังไง เก็บเป็น 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`;
แหล่งเรียนรู้
ปัญหาการลืม password เป็นเรื่องปกติ เนื่องจากเราชักจะมี password มากเกินไปเสียแล้ว และยังหาวิธีการดี ๆ ที่มีความปลอดภัยในการจำรหัสไม่ได้เสียที จะจดไว้ในสมุด ก็มีคนบอกว่าห้าม จะให้จำ ก็จำไม่หมด
เอาเป็นว่า กรณีของ MySql หากเราลืมรหัสของ root ก็เข้าไป reset หรือ ตั้งรหัสใหม่ก็แล้วกัน ขอบันทึกวิธีการ reset password ไว้กันลืม (ก่อนจะลืมวิธีการ reset password อีก)
วิธีการ reset password ของ MySql คือ
หยุดการทำงานของ mysql ก่อน
# /etc/init.d/mysql stop
Start MySQL เป็น save mode. โดยคำสั่ง
# mysqld_safe –skip-grant-tables &
Login MySQL โดย user root
# mysql -u root
Update password root (ใสรหัสใหม่แทน NEW PASSWORD)
mysql> use mysql; mysql> update user set password=PASSWORD(”NEW PASSWORD”) where user=’root’; mysql> flush privileges; mysql> quit;
Restart service ของ mysql ก็เป็นอันว่าเรียบร้อย
#/etc/init.d/mysql restart
แล้วลองเข้าใหม่ดูครับ
# mysql -u root -p
ที่มา SnappyTux