Bug #78974 mysqld_multi 无法关闭实例
Submitted: 27 Oct 2015 7:09 Modified: 27 Oct 2015 12:13
Reporter: faith cloud Email Updates:
Status: Duplicate Impact on me:
None 
Category:MySQL Server: Command-line Clients Severity:S2 (Serious)
Version:mysql-5.6.27 OS:CentOS (13120462292)
Assigned to: CPU Architecture:Any
Tags: mysqld_multi 无法关闭实例

[27 Oct 2015 7:09] faith cloud
Description:
[root@ctyun ~]# netstat -lntp | grep  mysql           #确认mysql的多实例已经启动
tcp        0      0 :::3316                     :::*                        LISTEN      11662/mysqld        
tcp        0      0 :::3317                     :::*                        LISTEN      11661/mysqld 

多实例的配置信息

[mysqld_multi]
mysqld=/usr/local/mysql/bin/mysqld_safe
mysqladmin=/usr/local/mysql/bin/mysqladmin
user	= multi_user
password = "abcd123"
log = /data/mysql/mysqld_multi.log

[mysqld3316]
port 				= 3316
innodb_data_home_dir 		= /data/mysql/mysql3316/data
datadir				= /data/mysql/mysql3316/data
innodb_log_group_home_dir 	= /data/mysql/mysql3316/logs
tmpdir          		= /data/mysql/mysql3316/tmp
socket          		= /tmp/mysql3316.sock
log-bin     			= /data/mysql/mysql3316/logs/mysql-bin
innodb_buffer_pool_size 	= 100M

[mysqld3317]
port 				= 3317
innodb_data_home_dir 		= /data/mysql/mysql3317/data
datadir 			= /data/mysql/mysql3317/data
innodb_log_group_home_dir 	= /data/mysql/mysql3317/logs
tmpdir          		= /data/mysql/mysql3317/tmp
socket          		= /tmp/mysql3317.sock
log-bin     			= /data/mysql/mysql3317/logs/mysql-bin

确认 mysql用户的账号密码
(product)root@localhost [mysql]> select host,user,password from user;
+-----------+------------+-------------------------------------------+
| host      | user       | password                                  |
+-----------+------------+-------------------------------------------+
| localhost | root       |                                           |
| localhost | multi_user | *CCB4F88E945E0E14F9BEB093EB797BB0BDBFA175 |
+-----------+------------+-------------------------------------------+
确认密码

(product)root@localhost [mysql]> select password('abcd123');
+-------------------------------------------+
| password('abcd123')                       |
+-------------------------------------------+
| *CCB4F88E945E0E14F9BEB093EB797BB0BDBFA175 |
+-------------------------------------------+
1 row in set (0.02 sec)

修改mysqld_multi  文件 使其可以输出调用的命令信息 在文件内添加

在 sub defaults_for_group 和 sub stop_mysqlds函数下添加
 print $com."\n";
执行关闭命令   #发现调用的命令里的密码都是******
/usr/local/mysql/bin/mysqladmin -u multi_user -p'*****' --port=3316 --socket=/tmp/mysql3316.sock
/usr/local/mysql/bin/mysqladmin -u multi_user -p'*****' --port=3316 --socket=/tmp/mysql3316.sock shutdown >> /data/mysql/mysql3316/data/mysqld_multi.log 2>&1 &
/usr/local/mysql/bin/mysqladmin -u multi_user -p'*****' --port=3317 --socket=/tmp/mysql3317.sock
/usr/local/mysql/bin/mysqladmin -u multi_user -p'*****' --port=3317 --socket=/tmp/mysql3317.sock shutdown >> /data/mysql/mysql3316/data/mysqld_multi.log 2>&1 &
检查端口是否真的关闭了
	
[root@ctyun ~]# netstat -lntp | grep  mysql			#可以看到端口依然存在
tcp        0      0 :::3316                     :::*                        LISTEN      4851/mysqld         
tcp        0      0 :::3317                     :::*                        LISTEN      4850/mysqld 

测试下 调用的命令是否正确 先关闭3316端口
[root@ctyun ~]# /usr/local/mysql/bin/mysqladmin -u multi_user -p'abcd123' --port=3316 --socket=/tmp/mysql3316.sock shutdown 
Warning: Using a password on the command line interface can be insecure.

[root@ctyun ~]# !net   		#可以看到使用调用的命令是可以进行mysql关闭操作的
netstat -lntp | grep  mysql
tcp        0      0 :::3317                     :::*                        LISTEN      4850/mysqld 

正常情况 如下
执行 关闭命令   #可以看到 密码是明文显示的
[root@ctyun ~]# /usr/local/mysql/bin/mysqld_multi stop 
my_print_defaults -s mysqld_multi
my_print_defaults -s mysqld3316
/usr/local/mysql/bin/mysqladmin -u multi_user -p'abcd123' --port=3316 --socket=/tmp/mysql3316.sock
/usr/local/mysql/bin/mysqladmin -u multi_user -p'abcd123' --port=3316 --socket=/tmp/mysql3316.sock shutdown >> /data/mysql/mysqld_multi.log 2>&1 &
my_print_defaults -s mysqld3317
/usr/local/mysql/bin/mysqladmin -u multi_user -p'abcd123' --port=3317 --socket=/tmp/mysql3317.sock
/usr/local/mysql/bin/mysqladmin -u multi_user -p'abcd123' --port=3317 --socket=/tmp/mysql3317.sock shutdown >> /data/mysql/mysqld_multi.log 2>&1 &

How to repeat:

[root@ctyun ~]# netstat -lntp | grep  mysql           #确认mysql的多实例已经启动
tcp        0      0 :::3316                     :::*                        LISTEN      11662/mysqld        
tcp        0      0 :::3317                     :::*                        LISTEN      11661/mysqld 

多实例的配置信息

[mysqld_multi]
mysqld=/usr/local/mysql/bin/mysqld_safe
mysqladmin=/usr/local/mysql/bin/mysqladmin
user	= multi_user
password = "abcd123"
log = /data/mysql/mysqld_multi.log

[mysqld3316]
port 				= 3316
innodb_data_home_dir 		= /data/mysql/mysql3316/data
datadir				= /data/mysql/mysql3316/data
innodb_log_group_home_dir 	= /data/mysql/mysql3316/logs
tmpdir          		= /data/mysql/mysql3316/tmp
socket          		= /tmp/mysql3316.sock
log-bin     			= /data/mysql/mysql3316/logs/mysql-bin
innodb_buffer_pool_size 	= 100M

[mysqld3317]
port 				= 3317
innodb_data_home_dir 		= /data/mysql/mysql3317/data
datadir 			= /data/mysql/mysql3317/data
innodb_log_group_home_dir 	= /data/mysql/mysql3317/logs
tmpdir          		= /data/mysql/mysql3317/tmp
socket          		= /tmp/mysql3317.sock
log-bin     			= /data/mysql/mysql3317/logs/mysql-bin

确认 mysql用户的账号密码
(product)root@localhost [mysql]> select host,user,password from user;
+-----------+------------+-------------------------------------------+
| host      | user       | password                                  |
+-----------+------------+-------------------------------------------+
| localhost | root       |                                           |
| localhost | multi_user | *CCB4F88E945E0E14F9BEB093EB797BB0BDBFA175 |
+-----------+------------+-------------------------------------------+
确认密码

(product)root@localhost [mysql]> select password('abcd123');
+-------------------------------------------+
| password('abcd123')                       |
+-------------------------------------------+
| *CCB4F88E945E0E14F9BEB093EB797BB0BDBFA175 |
+-------------------------------------------+
1 row in set (0.02 sec)

修改mysqld_multi  文件 使其可以输出调用的命令信息 在文件内添加

在 sub defaults_for_group 和 sub stop_mysqlds函数下添加
 print $com."\n";
执行关闭命令   #发现调用的命令里的密码都是******
/usr/local/mysql/bin/mysqladmin -u multi_user -p'*****' --port=3316 --socket=/tmp/mysql3316.sock
/usr/local/mysql/bin/mysqladmin -u multi_user -p'*****' --port=3316 --socket=/tmp/mysql3316.sock shutdown >> /data/mysql/mysql3316/data/mysqld_multi.log 2>&1 &
/usr/local/mysql/bin/mysqladmin -u multi_user -p'*****' --port=3317 --socket=/tmp/mysql3317.sock
/usr/local/mysql/bin/mysqladmin -u multi_user -p'*****' --port=3317 --socket=/tmp/mysql3317.sock shutdown >> /data/mysql/mysql3316/data/mysqld_multi.log 2>&1 &
检查端口是否真的关闭了
	
[root@ctyun ~]# netstat -lntp | grep  mysql			#可以看到端口依然存在
tcp        0      0 :::3316                     :::*                        LISTEN      4851/mysqld         
tcp        0      0 :::3317                     :::*                        LISTEN      4850/mysqld 

测试下 调用的命令是否正确 先关闭3316端口
[root@ctyun ~]# /usr/local/mysql/bin/mysqladmin -u multi_user -p'abcd123' --port=3316 --socket=/tmp/mysql3316.sock shutdown 
Warning: Using a password on the command line interface can be insecure.

[root@ctyun ~]# !net   		#可以看到使用调用的命令是可以进行mysql关闭操作的
netstat -lntp | grep  mysql
tcp        0      0 :::3317                     :::*                        LISTEN      4850/mysqld 

正常情况 如下
执行 关闭命令   #可以看到 密码是明文显示的
[root@ctyun ~]# /usr/local/mysql/bin/mysqld_multi stop 
my_print_defaults -s mysqld_multi
my_print_defaults -s mysqld3316
/usr/local/mysql/bin/mysqladmin -u multi_user -p'abcd123' --port=3316 --socket=/tmp/mysql3316.sock
/usr/local/mysql/bin/mysqladmin -u multi_user -p'abcd123' --port=3316 --socket=/tmp/mysql3316.sock shutdown >> /data/mysql/mysqld_multi.log 2>&1 &
my_print_defaults -s mysqld3317
/usr/local/mysql/bin/mysqladmin -u multi_user -p'abcd123' --port=3317 --socket=/tmp/mysql3317.sock
/usr/local/mysql/bin/mysqladmin -u multi_user -p'abcd123' --port=3317 --socket=/tmp/mysql3317.sock shutdown >> /data/mysql/mysqld_multi.log 2>&1 &

Suggested fix:
修改mysqld_multi文件中的defaults_for_group函数
		211 sub defaults_for_group
		212 {
		213   my ($group) = @_;
		214 
		215   return () unless $my_print_defaults_exists;
		216 
		217   my $com= join ' ', 'my_print_defaults', @defaults_options, $group;
		219   my @defaults = `$com`;
		220   chomp @defaults;
		221   return @defaults;
		222 }
		==========================
	
		把 my $com= join ' ', 'my_print_defaults', @defaults_options, $group;
		替换为: my $com= join ' ', 'my_print_defaults -s', @defaults_options, $group;
[27 Oct 2015 12:13] MySQL Verification Team
Hello!

Thank you for the report.
This is most likely duplicate of Bug #77227, please see Bug #77227

Thanks,
Umesh