MySQL命令行的几个用法
Google订阅 | 鲜果榜 | Technorati | Delicious | Twitter | Taobao DBA | 招聘 | 合租 | 管理 | 阿里妈妈

MySQL命令行的几个用法

MySQL的客户端命令行工具,有很多方便使用者的特性,某些方面甚至可以说比Oracle的sqlplus更加人性化。当然从整体来说,还是sqlplus更加方便些,这么说或许是我对sqlplus更加熟悉吧。这里记录下MySQL命令行几个比较常用的特性。

1.使用\G按行垂直显示结果
如果一行很长,需要这行显示的话,看起结果来就非常的难受。在SQL语句或者命令后使用\G而不是分号结尾,可以将每一行的值垂直输出。这个可能也是大家对于MySQL最熟悉的区别于其他数据库工具的一个特性了。

mysql> select * from db_archivelog\G
*************************** 1. row ***************************
        id: 1
 check_day: 2008-06-26
   db_name: TBDB1
  arc_size: 137
   arc_num: 166
per_second: 1.6
  avg_time: 8.7

2.使用pager设置显示方式
如果select出来的结果集超过几个屏幕,那么前面的结果一晃而过无法看到。使用pager可以设置调用os的more或者less等显示查询结果,和在os中使用more或者less查看大文件的效果一样。
使用more

mysql> pager more
PAGER set to 'more'
mysql> \P more
PAGER set to 'more'

使用less

mysql> pager less
PAGER set to 'less'
mysql> \P less
PAGER set to 'less'

还原成stdout

mysql> nopager
PAGER set to stdout

3.使用tee保存运行结果到文件
这个类似于sqlplus的spool功能,可以将命令行中的结果保存到外部文件中。如果指定已经存在的文件,则结果会附加到文件中。

mysql> tee output.txt
Logging to file 'output.txt'
或者
mysql> \T output.txt
Logging to file 'output.txt'

mysql> notee
Outfile disabled.
或者
mysql> \t
Outfile disabled.

4.执行OS命令

mysql> system uname
Linux
mysql> \! uname
Linux

5.执行SQL文件

mysql> source test.sql
+----------------+
| current_date() |
+----------------+
| 2008-06-28     |
+----------------+
1 row in set (0.00 sec)
或者
mysql> \. test.sql
+----------------+
| current_date() |
+----------------+
| 2008-06-28     |
+----------------+
1 row in set (0.00 sec)

其他还有一些功能,可以通过help或者?获得MySQL命令行支持的一些命令。

用HSCALE实现MySQL的数据分布式存储

针对单个表过大造成的性能问题,MySQL在5.1开始引入了分区表(partition),可以将数据在内部拆分存储,对应用透明,但是分区表只能将表在同一个数据库内部分解,而且对于表的维护(比如执行alter table)还是比较麻烦。手工分表也是一个解决方法,手工分表还有一个好处是可以将表分布到不同的服务器中,实现分布式存储。但是手工分表要求应用程序做相应的改写,以支持从不同的表中来存取数据。

HSCALE简单来说就是一个支持手工分表的中间层,对于应用来说看起来还是一个表,而由HSCALE来负责底层子表的数据存取。HSCALE是基于MySQL Proxy的一个插件应用,通过MySQL Proxy的lua脚本拦截分拆对应的SQL语句来实现数据的分布存储,而且使用lua脚本可以自由定制分表策略,比起MySQL自己的partition更加灵活些。现在版本还是0.2,功能有限,只能实现同库分表,但是基于MySQL Proxy的架构,未来要实现示分库分表也不是什么难事。

作者利用mysqlslap对HSCALE和MySQL Proxy做了几组性能测试,结果参考这里,还有这里

当然,现在MySQL Proxy和HSCALE都是刚刚起步,要在产品库中应用还有很长的一段路要走,从上面的性能测试中可以看到基于最新的MySQL Proxy 0.7版的HSCALE性能有了较大的提升,期待后续版本有更好的表现。

卸载rpm包遭遇error: specifies multiple packages

准备在Redhat Linux系统上安装MySQL5.1,先卸载自带的低版本MySQL,结果不知怎么搞的,同一个package出现了两次,版本也都是一样的:

rpm -qa | grep mysql
mysqlclient10-3.23.58-4.RHEL4.1
mysql-4.1.20-2.RHEL4.1
mysql-4.1.20-2.RHEL4.1
mysqlclient10-3.23.58-4.RHEL4.1

尝试卸载:

rpm -e mysqlclient10-3.23.58-4.RHEL4.1
error: "mysqlclient10-3.23.58-4.RHEL4.1" specifies multiple packages

通过man rpm,发现–allmatches应该可以解决这个问题:

–allmatches
Remove all versions of the package which match PACKAGE_NAME. Normally an error is issued if PACKAGE_NAME matches
multiple packages.

rpm -e --allmatches mysqlclient10-3.23.58-4.RHEL4.1
rpm -e --allmatches mysql-4.1.20-2.RHEL4.1
warning: /etc/my.cnf saved as /etc/my.cnf.rpmsave

ok,系统自带的旧版本MySQL卸载完成。

MySQL的conv函数

继续学习MySQL,这篇记录下conv函数。conv函数用于数字的进制转换,共有三个参数:

CONV(N,from_base,to_base)

N是要转换的数据,from_base是原进制,to_base是目标进制。

select conv(16,10,16);
+----------------+
| conv(16,10,16) |
+----------------+
| 10       |
+----------------+
1 row in set (0.04 sec)

如果N是有符号数字,则to_base要以负数的形式提供,否则会将N当作无符号数

mysql> select conv(-16,10,16);
+------------------+
| conv(-16,10,16)  |
+------------------+
| FFFFFFFFFFFFFFF0 |
+------------------+
1 row in set (0.00 sec)

mysql> select conv(-16,10,-16);
+------------------+
| conv(-16,10,-16) |
+------------------+
| -10        |
+------------------+
1 row in set (0.00 sec)

除了conv,还有几个特定进制转换的函数,如:

另外还有一个convert函数用于转换不同的数据类型的,不要和conv搞混淆了。