0

Ruby + MySQL จาก Macports

ผมใช้ ruby จาก rvm ไม่ได้ลงจาก macports ( อาจจะไม่เกี่ยวอะไรเลย ) แล้วก็ gem install ruby-mysql

ทีนี้ใน code ผมเขียนประมาณว่า


db = Mysql.connect('localhost', 'root', 'mypass', 'mydb')

แค่นี้เองพอ run แล้วเจ๊งเลยขึ้นแบบนี้ … gems/ruby-mysql-2.9.13/lib/mysql/protocol.rb:150: in`initialize': No such file or directory – connect(2) for “/tmp/mysql.sock” (Errno::ENOENT)

แต่อันนี้ก็ทำนองว่าเจอบ่อยแล้ว mysql ที่ลงจาก macports ไม่ได้ใช้ไฟล์นั้นผมก็เลยลองเข้าไปดูไฟล์ protocol.rb ก็มีท่าแก้แบบนี้

MYSQL_UNIX_PORT=/opt/local/var/run/mysql5/mysqld.sock ruby my_prog.rb

ใช้ได้เลย

1

วิธีแก้เวลา MySQL replication ค้าง

อันนี้จริง ๆ ออกแนวจดไว้ดูเองนะครับ แต่ถ้ามีประโยชน์กับท่านอื่น ๆ ก็ดี ผมมีปัญหาคือ master และ slave มันไม่ sync กัน พอดูใน slave แล้วมี row ที่ insert ไม่เข้า และ row นั้นใน master ก็ไม่มีแล้ว ผมใช้วิธี dump database จาก master มาใส่ที่ slave ก็ยังใช้ไม่ได้ หลังจากปรึกษามิตรสหายและเว็บต่าง ๆ แล้ว ต้องใช้ท่าเพิ่มเติมคือ

stop slave;

CHANGE MASTER TO MASTER_LOG_FILE=’mysql-bin.000xxxx’, MASTER_LOG_POS=xxxx, MASTER_USER=’xxxxxxx’, MASTER_PASSWORD=’xxxxxx';

start slave;

( พวก xxx ก็เปลี่ยนกันเอานะครับ )

จากนั้นค่อย dump db จาก master มาใส่ใหม่ เท่านี้ก็ใช้ได้แล้ว

ส่วนเลข MASTER_LOG_POS และ MASTER_LOG_FILE ดูมากจากเครื่อง master ด้วยคำสั่ง show master status; ครับ ขอบคุณคุณ @plutonix ที่ถามมา

พี่ต้นกำธรแจ้งว่าบอกให้มัน skip ได้ด้วย http://www.ducea.com/2008/02/13/mysql-skip-duplicate-replication-errors/

อ่านเพิ่ม (จาก @plutonix)

0

ลง pdo_mysql บน Mac OS X 10.7.5 ปน ๆ กับ Macports

ผมลง PHP 5.4 กับ Apache ผ่าน Macports แต่ว่า pdo_mysql ใน Macports ไม่มีมั้ง ก็เลยลง pear เอง แล้วก็จะลง pdo_mysql จากผ่าน pecl ลองลงแบบท่าปกติแล้วมันเจ๊ง ปัญหาส่วนมากเพราะหา mysql5 ที่ใน Macports นี่ path มันก็จะแปลก ๆ หน่อย

ปัญหาแรกคือหา mysql_config5 ไม่เจอ  ผมก็จัดแบบนี้เลย

PDO_MYSQL_CONFIG=/opt/local/bin/mysql_config5 /Users/user_name/pear/bin/pecl install pdo_mysql

อันนี้ก็เสร็จไปด่านหนึ่งแต่ว่า เวลามาเรียกก็ยังเจ๊งอยู่ดีขึ้น file not found อะไรสักอย่าง เพราะหา file ที่แทน socket ไม่เจอ อันนี้ก็เข้าไปแก้ใน /opt/local/etc/php54/php.ini เพิ่ม

pdo_mysql.default_socket=/opt/local/var/run/mysql5/mysqld.sock

เข้าไป ก็เป็นอันใช้ได้

0

ลง mysql บน macports แบบมั่วๆ

ผมลงแล้วเจ๊งอยู่หลายรอบ ท่านี้อาจจะไม่่ค่อยดีแต่ก็ใช้ได้แล้ว

sudo port install mysql5
sudo port install mysql5-server

sudo mysql_install_db5
chown -R _mysql:_mysql /opt/local/var/db
chown -R _mysql:_mysql /opt/local/var/run
chown -R _mysql:_mysql /opt/local/var/log

sudo -u _mysql /opt/local/libexec/mysqld –skip-grant-table &

mysql -uroot

ใน mysql client สั่ง
use mysql;
update user set password=PASSWORD(‘password ที่จะตั้ง’) where user=’root';
flush privileges;

(ออกจาก client)

kill mysqld ทิ้งซะ

สั่ง sudo port load mysql5-server

เสร็จแล้ว

0

แก้ mysql ให้ใช้ UTF-8 ใน my.ini/my.cnf

ผมก็เอามาแปะเลยแล้วกันนะ

[client]
default-character-set=utf8

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
collation_server=utf8_unicode_ci
character_set_server=utf8
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

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

ผมเพิ่มบรรทัดที่มี utf8 เข้าไป

0

MySQL: insert ถ้ายังไม่มี

ปกติใน MySQL (DBMS อื่นๆ ก็คงเหมือนกัน) ถ้าเราไป insert อะไรซ้ำๆ เข้าไปใน column ที่บังคับไว้ว่าต้อง unique มันก็จะเจ๊ง ก็เลยต้องมาดูก่อนว่ามีข้อมูลแล้วหรือยัง ค่อย insert แต่ว่าจะเขียน SQL อย่างไรให้สั้นๆ ง่ายๆ เท่าที่อ่านมาจาก http://bogdan.org.ua/2007/10/18/mysql-insert-if-not-exists-syntax.html ผ่านทาง http://stackoverflow.com/questions/1361340/how-to-insert-if-not-exists-in-mysql มาอีกที

ผมเลือกใช้ “on duplicate key update” เพิ่มใน insert เพราะเท่าที่อ่านมา 3 วิธีก็ วิธ๊นี้ก็ดูประหยัด และไม่ไปเพิกเฉยต่อ error อื่น ที่ไม่เกี่ยวข้อง

สมมุติว่าผมจะเพิ่ม 6 เข้าไปใน textunit_conflicts.textunit_id ก็เขียนแบบนี้

insert into textunit_conflicts value (6) on duplicate key update textunit_id = textunit_id;

textunit_id = textunit_id ก็เขียนไปไม่ให้มันผิด syntax เฉยๆ