Thursday, January 28, 2010

mysql 客户端中比较有用的几个命令

mysql> help

For information about MySQL products and services, visit:
   http://www.mysql.com/
For developer information, including the MySQL Reference Manual, visit:
   http://dev.mysql.com/
To buy MySQL Network Support, training, or other products, visit:
   https://shop.mysql.com/

List of all MySQL commands:
Note that all text commands must be first on line and end with ';'
?         (\?) Synonym for `help'.
clear     (\c) Clear the current input statement.
connect   (\r) Reconnect to the server. Optional arguments are db and host.
delimiter (\d) Set statement delimiter.
edit      (\e) Edit command with $EDITOR.
ego       (\G) Send command to mysql server, display result vertically.
exit      (\q) Exit mysql. Same as quit.
go        (\g) Send command to mysql server.
help      (\h) Display this help.
nopager   (\n) Disable pager, print to stdout.
notee     (\t) Don't write into outfile.
pager     (\P) Set PAGER [to_pager]. Print the query results via PAGER.
print     (\p) Print current command.
prompt    (\R) Change your mysql prompt.
quit      (\q) Quit mysql.
rehash    (\#) Rebuild completion hash.
source    (\.) Execute an SQL script file. Takes a file name as an argument.
status    (\s) Get status information from the server.
system    (\!) Execute a system shell command.
tee       (\T) Set outfile [to_outfile]. Append everything into given outfile.
use       (\u) Use another database. Takes database name as argument.
charset   (\C) Switch to another charset. Might be needed for processing binlog with multi-byte charsets.
warnings  (\W) Show warnings after every statement.
nowarning (\w) Don't show warnings after every statement.

For server side help, type 'help contents'

谈一下个人觉得上面比较有用的几个命令:
1、 edit
mysql>\e
输入\e后调用系统的默认文本编辑器,如vi出来,用于编辑SQL语句,避免直接在命令行中,太长的SQL输入错误,修改起来麻烦,输入完成保存退出即运行。

2、 pager
利用此命令最方便就是可以结合less查看输出结果,有时比用\G输出要方便整齐。在mysql命令行中输入:
mysql>pager less -S
之后的查询就会以不折行的形式输出到控制台。另一个用法是将SQL输出重定向到另外一个文本日志文件中:
mysql>pager cat > /tmp/sql_log.txt
以后的查询生成结果会被写入此文件中。

3、 tee
这个命令的功能与pager重定向日志文件类似,可以将生成的日志写入外部文件中。
mysql>tee /tmp/sql_log.txt

4、 system
在mysql console中运行外部操作系统的命令:
mysql>\! ls -l

5、 source
执行外部的SQL文件,有时在命令行中直接导入外部的一个SQL文件:
mysql>source /home/yu/test.sql;
这个与在操作系统命令行下执行:
$>mysql -u test -p < /home/yu/test.sql
效果一样。

Reference:
http://dev.mysql.com/doc/refman/5.0/en/mysql-commands.html

Thursday, December 10, 2009

MySQL5.0 同步备份恢复的三种方法

第一种最简单的方法适用于数据库文件比较小,能在停止主数据库服务后几分钟内打完tar包的情况,这种情况与第一次做slave同步的方法一样:
mysql> FLUSH TABLES WITH READ LOCK;
mysql > SHOW MASTER STATUS;
记录状态后进入命令行将数据库原生数据文件打个tar包,再
mysql> UNLOCK TABLES;
将tar包重布署到MySQL slave上即可,注意将tar包中的日志文件,master.info,relay-log.info要删除之后再CHANGE MASTER TO。

第二种方法是利用mysql的二进制日志文件。
首先重启一次主数据库。
然后在slave上用以下命令查看二进制日志文件执行的最后SQL语句,其中start-datetime时间为此二进制日志文件最后的修改时间,或者提前30秒方便查看最后执行完成的SQL语句:
$> mysqlbinlog -S /tmp/mysql.sock hostname-relay-bin.000002 --start-datetime='2009-12-11 11:12:00'

然后在主数据库上用命令筛选出符合时间范围的日志:
$> mysqlbinlog --start-datetime='2009-12-11 11:12:00' -S /tmp/mysql.sock mysql-bin.000007 > /home/username/bin-log.sql
再用grep命令,查找到bin-log.sql中与之前在slave上查到的SQL行号,并用sed命令删除1到此行号的全部行(举例查到行号为1234):
$> grep -n "last executed sql statement" /home/username/bin-log.sql
$> sed '1,1234d' /home/username/bin-log.sql > /home/username/bin-log-sed.sql
将生成的bin-log-sed.sql文件传到slave数据库上用mysql命令行工具导入数据。
$> mysql -uroot -p < bin-log-sed.sql
如果碰到报错,用sed再删除sql文件的前几行导入。
导入完成后,进行mysql控制台,下面的master_log_file是同步中断的主数据库日志文件mysql-bin.000007的后继日志文件名mysql-bin.000008:
$> stop slave;
$> change master to master_log_file='mysql-bin.000008', master_log_pos=98;
$> start slave;
$> show slave status\G

第三种方法也是利用二进制日志文件恢复。
与第二种方法类似,只是在grep查到行号之后,用awk命令找到日志中断的位置,重新调整slave上的master_log_pos即可。
举例查到行号为1234:
$> cat /home/username/bin-log.sql |awk 'NR >= 1234 {print $0}' |more
可以找到最后执行完的那个SQL之后,服务器的二进制日志文件位置:
last executed sql statuement;
之后会看到类似:
# at 1023411738
这样的内容,用这个值更新slave上的master信息:
$> stop slave;
$> change master to master_log_file='mysql-bin.000007', master_log_pos=1023411738;
$> start slave;
$> show slave status\G
在slave的二进制日志或者是hostname-relay-log.info,hostname.err中也会有master上的end_log_pos,可以先尝试用一下,一般因为master/slave异常才导致同步失败,在slave上的这些信息已经不正确,所以需要用awk找到服务器上的二进制日志位置。


MySQL5 Replication fails with "log event entry exceeded max_allowed_packet"

配置文件中有二个参数设置需要注意,max_allowed_packet在主从服务器上的设置最好是设置相同,并且将read_buffer_size <= max_allowed_packet。 
如果这二个配置正确,仍然报错,则需要STOP SLAVE; 并CHANGE MASTER TO,调整master_log_pos的值,这个值与服务器的日志文件要对应上。
Reference: http://bugs.mysql.com/bug.php?id=15937
http://bugs.mysql.com/bug.php?id=8215