MySQL命令行的几个用法
MySQL的客户端命令行工具,有很多方便使用者的特性,某些方面甚至可以说比Oracle的sqlplus更加人性化。当然从整体来说,还是sqlplus更加方便些,这么说或许是我对sqlplus更加熟悉吧。这里记录下MySQL命令行几个比较常用的特性。
1.使用\G按行垂直显示结果
如果一行很长,需要这行显示的话,看起结果来就非常的难受。在SQL语句或者命令后使用\G而不是分号结尾,可以将每一行的值垂直输出。这个可能也是大家对于MySQL最熟悉的区别于其他数据库工具的一个特性了。
*************************** 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
PAGER set to 'more'
mysql> \P more
PAGER set to 'more'
使用less
PAGER set to 'less'
mysql> \P less
PAGER set to 'less'
还原成stdout
PAGER set to stdout
3.使用tee保存运行结果到文件
这个类似于sqlplus的spool功能,可以将命令行中的结果保存到外部文件中。如果指定已经存在的文件,则结果会附加到文件中。
Logging to file 'output.txt'
或者
mysql> \T output.txt
Logging to file 'output.txt'
mysql> notee
Outfile disabled.
或者
mysql> \t
Outfile disabled.
4.执行OS命令
Linux
mysql> \! uname
Linux
5.执行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出现了两次,版本也都是一样的:
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
尝试卸载:
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 mysql-4.1.20-2.RHEL4.1
warning: /etc/my.cnf saved as /etc/my.cnf.rpmsave
ok,系统自带的旧版本MySQL卸载完成。
MySQL的conv函数
继续学习MySQL,这篇记录下conv函数。conv函数用于数字的进制转换,共有三个参数:
N是要转换的数据,from_base是原进制,to_base是目标进制。
+----------------+
| conv(16,10,16) |
+----------------+
| 10 |
+----------------+
1 row in set (0.04 sec)
如果N是有符号数字,则to_base要以负数的形式提供,否则会将N当作无符号数
+------------------+
| 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,还有几个特定进制转换的函数,如:
- hex(N)相当于conv(N,10,16)
- oct(N)相当于conv(N,10,8)
- bin(N)相当于conv(N,10,2)
另外还有一个convert函数用于转换不同的数据类型的,不要和conv搞混淆了。