Linux (ubuntu 10.10) 安装两个MySQL

最近在实习的地方学到了很多,linux命令、shell、mysql等等。能在实际中使用已学的东西,并找到感兴趣的东西,是很美好的一件事。

闲话不扯,记录下这次解决的问题。

操作系统:ubuntu 10.10

需求:在当前主机安装两个mysql,使用不同的端口号进行访问,以便内部服务器测试使用

一开始在网上搜罗了半天,没头绪,看到有人说不必这么麻烦装两个mysql,只要生成两个实例(改改配置文件)就可以。不知道是自己笨还是哪里操作有问题,反正没成功,最后连数据库都进不去了。只能果断放弃。

之后搜到了两个网址,感觉蛮不错的,步骤清晰(但因为操作系统不同,所以稍微之后的操作有点不同),就直接试了下:

ACCP5200
② hj12333

第一个看着更详细,我就按着那个来了~(这两个在执行./configure的时候,后面的参数都不适合我的配置,需要改进!)

第一个mysql之前就装好了,所以就去mysql官网下了个源码包(mysql 5.1.66),重新编译安装第二个mysql。

解压后执行./configure,出了个错误:configure: error: No curses/termcap library found

百度之后发现是缺少libncurses造成的,于是果断apt之:apt-get install libncurses5-dev,网上还有个方法是通过安装g++搞定的,没试过,在这里仅供记录。

本以为./configure make && make install 一路顺利之后就可以搞定了,天不随人意呐(ㄒoㄒ)//,打开第二个mysql服务(我命之为mysql5)的时候,又出错了Q_Q

...... * Manager of pid-file quit without updating file.

查了好久,百度了好久(其实那天下午基本上就是在解决这个问题o(-"-)o),发现可能是./configure的时候没把参数陪对,天杀的,只能把变编译、安装好的给卸载掉了╯﹏╰

进到configue所在目录,执行:make uninstall && make clean,然后重新configure:

./configure --prefix=/usr/local/mysql5 --with-comment=Source --with-mysqld-user=mysql --without-debug --without-bench --enable-thread-safe-client --enable-assembler --enable-profiling --with-charset=utf8 --with-collation=utf8_general_ci --with-extra-charsets=utf8 --with-plugin-innobase --without-embedded-server --with-server-suffix=-ubuntu --enable-local-infile --with-unix-socket-path=/tmp/mysql5.sock --localstatedir=/var/lib/mysql5

说明下:这个mysql我安装在/usr/local/mysql5下;字符集因为需要改成了utf-8的;去掉了ACCP5200和hj2333中都有的一项:--with-plugin=all;服务器的名字:--with-server-suffix=-ubuntu;socket路径(这个一定要设置对,要记住!!):--with-unix-socket-path=/tmp/mysql5.sock;数据库的文保存在:/var/lib/mysql5

等了好几分钟,终于编译安装好了\(^o^)/

运行:service mysql5 start,没报错!!只不过显示得不太正常:

Starting MySQL
. *

不像第一个mysql,启动服务的时候会显示:mysql start/running, process 3697

不管了,反正是好了(好了?真的好了?悲剧由此开始。。)

进入mysql5一看,傻眼了,还是第一个mysql中的表,本来想运行第一个mysql看看的,结果运行不起来。用ps axf | grep mysql查看了下,发现有一行命令很奇怪:

3605 pts/0 Sl 0:02  \_ /usr/local/mysql5/libexec/mysqld --defaults-file=/etc/mysql5/my5.cnf --basedir=/usr/local/mysql --datadir=/var/lib/mysql --user=mysql --log-error=/var/lib/mysql/xxx.err --pid-file=/var/lib/mysql/xxx.pid --socket=/tmp/mysql5.sock --port=3307

我指定的datadir明明是/var/lib/mysql5为什么就变成/var/lib/mysql了呢(这个文件夹存的mysql中的数据库信息,而不是我那mysql5的),问题很可能就在这。不过,鉴于时间的原因(当时已经20:30分多了,赶回学校需要2个小时,最快也要1个半小时,作为一个实习生,我也算敬业了吧◑﹏◐),只好匆匆收拾一下就回去了。

第二天,来了之后在mysql5的启动脚本上做了点手脚:-P,在开头的地方添加了句:trap 'echo -n "$LINENO"' DEBUG,然后用bash打开调试模式:bash -x /etc/init.d/mysql5,查看问题到底在哪里。扫了一眼,parse_server_arguments 的调用处指定的datadir变成了/var/lib/mysql而不是我在该脚本开头设定的datadir=/var/lib/mysql5,追着parse_server_arguments的踪迹,找到了这么行代码:parse_server_arguments `$print_defaults $extra_args mysqld server mysql_server mysql.server`。问题就在这里了!经过两三次测试发现是由于parse_server_arguments这个函数把我设的datadir改掉的(当时是修改了mysqld这个参数,导致$print_defaults(该变量引用了/usr/local/mysql5/bin/my_print_defaults这个程序)不能正常返回值,所以parse_server_arguments这个函数没有修改我设的参数。果断注释掉这条语句,之后重启了下mysql5:service mysql5 start,然后试着进入:mysql -uroot -p --socket=/tmp/mysql5.sock,能进去!查看了下数据库,是个新的!!感动ing~然后试着打开第一个mysql,也能正常访问。至此,终于告一段落了~\(≧▽≦)/~

经过这么一弄,大致对mysql的启动过程有了感性的了解,不枉此行了~~

下面把操作过程罗列一下:

1.安装数据库:

tar -zxvf mysql-5.1.66.tar.gz

cd mysql-5.1.66

mkdir /usr/local/mysql5

./configure --prefix=/usr/local/mysql5 --with-comment=Source --with-mysqld-user=mysql --without-debug --without-bench --enable-thread-safe-client --enable-assembler --enable-profiling --with-charset=utf8 --with-collation=utf8_general_ci --with-extra-charsets=utf8 --with-plugin-innobase --without-embedded-server --with-server-suffix=-ubuntu --enable-local-infile --with-unix-socket-path=/tmp/mysql5.sock --localstatedir=/var/lib/mysql5

#(若出现configure: error: No curses/termcap library found,执行:apt-get install libncurses5-dev)

make && make install

2.初始化数据库并授权:

#(ll /var/lib/mysql5 看看有没有产生这个目录,没有就新建一个mkdir /var/lib/mysql5)

/usr/local/mysql5/bin/mysql_install_db

cd /usr/local/mysql5

chown -R mysql:mysql .

chown -R mysql:mysql /var/lib/mysql5

chgrp -R mysql .

3.复制配置文件,并添加自启动脚本:

cp share/mysql/my-small.cnf /etc/mysql5/my5.cnf

cp share/mysql/mysql.server /etc/init.d/mysql5

chmod 755 /etc/init.d/mysql5

4.搜索并修改启动脚本/etc/init.d/mysql5:

1)datadir=/var/lib/mysql5

2)conf=/etc/mysql5/my5.cnf

3)把$bindir/mysqld_safe --datadir=$datadir --pid-file=$server_pid_file $other_args >/dev/null 2>&1 &替换为:

$bindir/mysqld_safe --defaults-file=/etc/mysql5/my5.cnf --datadir=$datadir --pid-file=$server_pid_file $other_args >/dev/null 2>&1 &

* 4)如果不能正常启动则把下面这句注释掉(前面加个#):

parse_server_arguments `$print_defaults $extra_args mysqld server mysql_server mysql.server`

5.保存退出并添加服务:

chkconfig --add mysql5

6.修改配置文件/etc/mysql5/my5.cnf([client] 和 [mysqld]里的都要改):

#改成自己指定的端口

port = 3307

#更改socket

socket = /tmp/mysql5.sock

#出问题的话,添加个datadir

datadir = /var/lib/mysql5

 

7.重启服务:

service mysql5 start

 

8.检查是否启动成功:

ps axf | grep mysql

若这一项(/usr/local/mysql5/libexec/mysqld),后面的参数正确:--defaults-file=/etc/mysql5/my5.cnf --basedir=/usr/local/mysql5 --datadir=/var/lib/mysql5 --socket=/tmp/mysql5.sock --port=3307

都指向mysql5而不是mysql的话就应该是对了

 

9.修改密码:

mysqladmin -uroot password '你的密码'

 

10.测试登陆(要指定socket,否则会使用默认的第一个mysql的数据库):

mysql -uroot -p你的密码 --socket=/tmp/mysql5.sock

原文地址:https://www.cnblogs.com/Nstd/p/2721809.html