关于 mysql2 gem 和 MariaDB

MariaDB 可以被看作是 MySQL 的增强版, 在绝大多数情况下用 MariaDB 替代 MySQL 都能取得不错的效果. 只是一些接口程序依旧把 MariaDB 当作 MySQL (这也没什么错吧), 例如安装 mysql2 gem 的时候, 我不得不如此才能把这个 gem 正常安装:

sudo apt-get install libmariadb-client-lgpl-dev libmariadb-client-lgpl-dev-compat
gem install mysql2 -v '0.3.14' -- --with-mysql-include=/usr/include/mariadb/

🙂

利用 bash 命令做 SQL 数据修补

如果是把一个 DB 或者一个 table 从一个服务器送到另一个, 那么使用 mysqldump 命令就可以了. 但有的时候, 需要的数据可能只是若干条记录, 就不能用 mysqldump 了. 奇怪的是我 google 了一番居然也没找到很方便的方法. 求人不如求自己吧, 下面是用 bash 命令的解决方法:

mysql <database> -uroot -e “select * from <table> where <condition>…” |tail -n +2 |sed -e ‘s/^/(“/g’ -e ‘s/$/”)/g’ -e ‘s/\t/”,”/g’ |while read values; do echo “insert into <table> values $values”; done

然后把输出的 SQL 在目标服务器上运行即可. 记得把< >里面的变量替换为实际需要的内容. 🙂

利用 LVM 在线抓取 MySQL 数据库快照

小试分身 MySQL Replication, 上次是按照 MySQL 教程做的, 比较死板(或者说, 安全), 但需要锁住数据库, 也就是说, 用户一端的感觉就是服务器出问题了… 而如果通知用户服务器要下线一段时间的话, 又会引起不明真相的用户的莫名猜疑. 那么就需要一种在几秒中之内完成生成镜像的操作, 于是我就想到了 LVM snapshot.

Google 了一番, 我看到已经有成功先例了, 步骤如下:

1, 确认 MySQL 的数据区(缺省 /var/lib/mysql) 是在 LVM 上, 假设是 /dev/VOLUME_GROUP/data
2, 开一个 MySQL session, 执行并记录 show master status 的输出:

flush tables with read lock;
show master status;

3, 在另一个 terminal 执行:

lvcreate -s -n snapshot_name -L5G /dev/VOLUME_GROUP/data

4, 在步骤2的 session 里继续:

unlock tables;

5, /dev/VOLUME_GROUP/snapshot_name 里面就是需要的快照了, 之后将快照复制到从属服务器上然后开启 replication 即可, 这里就略过了.

步骤2/3/4应该可以写到一个 shell script 里面, 这样数据库锁住的时间应该能在3~5秒之内, 用户可能会感觉数据更新时慢了一些, 希望不会有人因为几秒钟的耽搁而花20分钟来投诉吧 🙂