我尝试在一台服务器上设置多个 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)