Jacky Liu's Blog

转移 MySQL 的数据(datadir)

---- 开始看 MySQL 不久。还没做任何实际操作之前,就想把它默认的存储数据库文件的目录从 "/var/lib/mysql" 搬到 "/home" 自己的目录下面。一般来说,需要转移 MySQL 数据目录的原因可以有很多,比较典型的是因为原来的硬盘不够大。不过对我来讲没那么复杂,主要是因为想把关键文件都放一起,这样下次系统崩溃的时候比较容易把文件倒出来。

---- 这个并不复杂的问题差不多折腾了一整天。其实关键就下面几点:

    1. 找到 mysql 启动时加载的 Option File(如果有多个,那么一定是起作用的那一个)。在我的机器上只有一个,是 "/etc/mysql/my.cnf",进去把 datadir 一项的值改成自己指定的目录。这个不难。

    2. 最关键的,把原先的数据目录(默认是 "/var/lib/mysql")里面的东西都转移到新的目录下,而且 !一定! 要保证相关的内容在新的目录下仍然保持跟原来一样的用户和权限设置。用 chown 和 chmod 就能搞定,很简单。但是如果这步出了差错,找起来就麻烦了,重新启动 mysql 的时候只会说连不上,很难发现真正的原因。我是通过 Ubuntu 下的 Package Manager 安装的 MySQL,安装之后相关文件和目录的 user name 和 group name 都是 “mysql”,所以新的 datadir 也要将 owner 设成 mysql,并确保它有合适的权限。

    3. 不仅要保证 datadir 的用户/权限设置正确,如果 datadir 目录比较深的话,好像跟上面几级目录的权限也有关系。总之,要保证用户 “mysql” 能顺利地访问新的 datadir 的内容,而且要保证所有必要的内容都已被复制到新的 datadir 下面。在 MySQL 里面,像用户记录这种启动时必需的信息也是以数据库形式保存的,mysql 在启动时会加载这些必需的 database,如果相关目录的权限有问题,或者文件根本不存在,都会启动失败。

    4. 关于 AppArmor,网上资料说需要把所做的改动通过 profile 文件告诉它,否则 AppArmor 会阻止 mysql 访问新的文件路径而导致 mysql 不能运行。以我的经验来看,好像没感觉到 AppArmor 的影响。不过保险起见,还是按照网上说的,修改一下它的 profile 文件,在我的机器上是: "/etc/apparmor.d/usr.sbin.mysqld",照着原先 datadir 有关内容的格式,新加几行:

        /my/new/datadir/ r,
        /my/new/datadir/** rwk,

    5. AppArmor 和 mysql 都需要重启。重启的命令是:
       
        sudo /etc/init.d/{apparmor|mysql} stop
        sudo /etc/init.d/{apparmor|mysql} start

    或者用 service 命令也可以:

        sudo service {apparmor|mysql} stop
        sudo service {apparmor|mysql} start

---- TroubleShooting:

    mysql 的 Error log 文件,在我的机器上是: "/var/log/mysql/error.log",如果出了问题,这里记录的是真正的原因。对于终端里的几行输出不用太在意,基本上无论出什么事都只会说连不上 Server,没什么用。
 

彻底颓了—— Vim Python 3 接口不支持中文

折腾了好久才编译出来一个支持 Python 3 的 Vim,谁知居然有这么多问题。

除了 vim.current.buffer 对象不再支持 slice 类型参数以外,今天又发现这个:

:py3 vim.current.buffer.append('XXX 模块的控制面板')

结果在 Vim 里加进去的一行看起来是这样:

XXX 模块<e7>

也就是,遇到有的中文字符会无法解释,成为乱码。用 依云 发来的她编译的版本,结果也一样。是不是因为 Python 3 接口对 Unicode 字符的宽度理解有问题,遇到有些字符会认不得 ? 这给人感觉并不是个发布版的软件,问题好多。

想到一种可能——因为对自由软件来说,并不存在所谓质量控制的问题,也没法做大规模完善的测试,而且写作和维护的人手比商业软件一般也少得多,所以有可能作者是有意在还不完善的状况下就发布出来,然后大家就会发现问题,还有一些等不及更新的牛人就会发布 patch,然后作者或者维护者就只要把这些 patch 打进去就可以了。这样可以使自由软件保持比较快的更新速度,可能在维护的人手比较少的情况下,这也是唯一可行的做法。

对我来讲这几天吃螃蟹的经验就比较让人失望。还是回去用 7.2 吧。

Vim 里的上下左右,给玩惯了游戏的 Vimmer

Vim 里的上下左右默认是 hjkl 四个键,这是与 vi 兼容的设置。如果你玩惯了赛车一类的游戏,相信打死你也适应不了这样的设置。我就是这样。所以当初学用 Vim 的时候,我第一件要看的就是怎样定义按键映射。实际上只要很简单的几行设置,就可以把方向键映射到 ikjl 四个键上,这样跟小键盘上的方向键位置吻合,用起来就舒服得多。以下是我放在 .vimrc 里面的代码,用下来很久了,没出过什么问题。

"------------------------------------------------------------------------------------
"-------			所有模式下
"------------------------------------------------------------------------------------

no		i	k
no		k	j
no		j	h
no		h	i

no		I	H
no		H	I

"------------------------------------------------------------------------------------
"-------		Visual 模式
"------------------------------------------------------------------------------------

vno	h(	i(
vno	h)	i)
vno	h<	i<
vno	h>	i>
vno	hB	iB
vno	hW	iW
vno	h[	i[
vno	h]	i]
vno	hb	ib
vno	hp	ip
vno	hs	is
vno	hw	iw
vno	h{	i{
vno	h}	i}

定义了这些按键以后,i 就是向上,k 是向下,j 和 l 是左和右。另外只要记着,任何时候原来该按 i 的地方就按 h,Visual Block (列编辑)模式下该按 I 的地方就按 H,就行了。

基于 Vim 的窗口布局管理和用户界面实现

第一篇,写个关于 Vim 的。

今天花了点时间,增强了 ModuleManager 中的窗口布局类的功能。现在辅助窗口的数量已经不受限制了。

这个 Vim 界面里一共有 13 个窗口。左右各 3 个,下面 6 个,还有中间一个大的。可以同时显示很多信息。但是布局并不凌乱。实际上这个类里面定义了多个窗口布局方案,打一个命令就把所有窗口自动划分好。上面这个只是其中一种。窗口大小会根据光标的移动自动调整,使用自动命令(AutoCmd)机制。进入窗口时自动变大,离开时自动缩小。许多窗口都压到 了最小。试了一下,效果跟预期的完全一样。我表示非常地满意 :)

当然如果只是分分窗口的话并没什么太大用处。实际上整个的想法比这个要大,主要是想拿 Vim 当做一个应用程序的用户界面,这个窗口布局类只是其中一部分,算是用户界面的形式。形式有了以后就要跟功能接合起来,而功能主要依靠 Vim buffer 来实现。

Vim buffer 是在 Vim 基础上用来搭建用户界面的绝好组件。因为首先它显示了要给用户看的信息(颜色与格式在 Vim 里当然不是问题),其次,它里面定义了用户可以进行的操作(通过按键映射和自定义命令)。这不就是用户界面么?按照 Vim 的设计,按键映射和自定义命令都是跟着 buffer 走的。窗口里换了一个 buffer,操作也就跟着换一套。想想使用 IDE 的时候,你在文件目录窗口和在调试输出窗口内按 Enter 键自然具有不同的含义。有了 Vim 这种设计的强大支持以后,只需要把这些 Vim Buffer 定义成类(写成 Vim Script 类或者利用 Python 接口写成 Python 类,都可以),一个类实现一个具体功能,比如相关文件结构浏览,又比如针对主窗口内显示的内容来提取它的目录,同时再定义一套独有的操作,然后这些前台类组合在一起,加上一些后台的执行类形成用户界面,然后用户界面再跟更多,更实质性的功能类放在一起,形成整个程序。

另外要知道一点,按照 Vim 的设计,不是一个窗口只能加载一个 buffer,而是任一个窗口都能加载任一个 buffer。觉得 13 个窗口够多了吗?实际上它能加载的功能模块是根本没有数目限制的。当你看到某个 IDE 有一个很好的功能,OK,只要以 Vim Buffer 为基础再定义一个类,实现这个功能,加到用户界面里面,再给它分配个窗口就行。觉得窗口太多太乱?换个窗口少点的布局,那些 Vim Buffer 只是转为 hidden 而已,随时可以加载进窗口里,为你服务。

IDE 是一个比较典型的例子。如果我想弄个 IDE,我就要把它弄成上面的样子,但是程序开发不是我的方向,我要拿它做别的事情。

实际上在我看来,这个最大的意义在于显示了技术是怎样能帮你省钱的,要显示同样多的信息,并不用跟一般操盘的一样搞个三四台显示器放在面前,可能还要架起来。很好很好,以后的外部程序界面就用它 !:)




Host by is-Programmer.com | Power by Chito 1.3.3 beta | © 2007 LinuxGem | Design by Matthew "Agent Spork" McGee