运行多个 MySQL 实例时的困惑

运行多个 MySQL 实例时的困惑

我尝试在一台服务器上设置多个 MySQL 数据库实例,但得到了一些非常奇怪的结果。我可以启动并运行不同的实例,监听不同的端口,使用不同的 .cnf 文件,使用不同的数据目录等。据我所知,我有两个独立的实例。下面是我运行“ps aux | grep mysql”时的副本。

root      2827  0.0  0.0   2592  1140 pts/1    T    14:30   0:00 /bin/sh /usr/bin/mysqld_safe --defaults-file=/etc/my.cnf
mysql     2858  0.0  1.0 119692 18312 pts/1    Sl   14:30   0:00 /usr/libexec/mysqld --defaults-file=/etc/my.cnf --basedir=/usr --datadir=/var/lib/mysql --user=mysql --pid-file=/var/run/mysqld/mysqld.pid --skip-external-locking --port=3306 --socket=/var/lib/mysql/mysql.sock
root      2887  0.0  0.0   2592  1140 pts/1    T    14:34   0:00 /bin/sh /usr/bin/mysqld_safe --defaults-file=/etc/my2.cnf
mysql     2921  0.0  1.0 119492 17596 pts/1    Sl   14:34   0:00 /usr/libexec/mysqld --defaults-file=/etc/my2.cnf --basedir=/usr --datadir=/var/lib/mysql2 --user=mysql --pid-file=/var/run/mysqld/mysqld2.pid --skip-external-locking --port=3307 --socket=/var/lib/mysql2/mysql2.sock

现在事情变得奇怪了。当我使用 Navicat 远程登录数据库时,我可以编辑数据库的内容,没有问题。但是,当我运行脚本来访问不同数据库上的数据时,我得到了一个表不存在的错误,因为脚本试图访问在端口 3306 上运行的第一个实例,即使我为第二个连接资源指定了端口 3307。

我注意到的另一件事是,如果我通过 SSH 进入包含两个数据库实例的服务器并使用登录其中一个mysql -u root --port=3306 -p并执行某些操作(例如更改 root 用户的密码),则当我尝试使用连接时,root 密码已经更改mysql -u root --port=3307 -p

我已经研究这个问题几天了,但完全不知所措。我在 Amazon AWS 服务器上使用 Fedora 8。任何帮助都将不胜感激!

以下是my.cnf的内容:

[mysqld] datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
port=3306
user=mysql
old_passwords=1
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

以下是my2.cnf的内容:

[mysqld]
datadir=/var/lib/mysql2
socket=/var/lib/mysql2/mysql2.sock
port=3307
user=mysql
old_passwords=1
[mysqld_safe]
log-error=/var/log/mysqld2.log
pid-file=/var/run/mysqld/mysqld2.pid

答案1

要连接到端口 3307 上运行的 mysql 服务器,请使用:

$ mysql --socket=/var/lib/mysql2/mysql2.sock

--port只是改变了 TCP/IP 端口号,但是当您通过套接字连接时,您需要给它另一个套接字名称。

答案2

问题是,当您运行 mysql 并且没有明确指定 localhost 以外的主机名(我建议使用本地计算机的 IP 地址:127.0.0.1)时,所有 MySQL 命令(包括 mysql 本身)都将假定套接字连接。您的 --port 参数实际上被忽略了,mysql 客户端通过 /var/lib/mysql/mysql.sock(第一个实例的套接字)进行连接。

看一下这个:

$ mysql --host=localhost --port=3306
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

相对:

$ mysql --host=127.0.0.1 --port=3306
ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1' (111)

相关内容