全部博文(321)
分类: LINUX
2013-03-20 15:12:31
关于单实例安装,参http://hi.baidu.com/traindiy/blog/item/a6d9b6317d710fb75fdf0e48.html
在单实例MYSQL基础上,扩展成多实例。
测试环境:
centos 6.2+mysql5.5.20
原先有安装过单独的mysql5.5.20 ,端口3306,数据库保存路径/mysqldata,
拟增加一个实例,数据库保存路径为/mysqldata2。
所有实例的socket文件和PID文件均保存到安装目录/usr/local/mysql下。
*********************************************************************************************
原理:把原单实例由mysqld启动,改为用mysqld_multi调用。重点有两个:
1、修改my.cnf
2、对mysqld_multi启动用户,必须在mysql中创建'user'@'localhost'和密码(与my.cnf中定义的须一致)
mysqld_multi服务会调用mysqladmin工具来启动和关闭服务。如下:
shell> mysqladmin -uroot -P3306 -p123456 shutdown -S /usr/local/mysql/mysql.sock
因此,在创建多实例时,配置文件[mysqld_multi]一组必须写上帐户和密码。
此帐户是MYSQL的帐户,而不是系统的帐户。并需在MYSQL中授予上述命令的shutdown权限。
这样才能正常使用mysqld_multi来关闭和启动MYSQL服务。
【注】创建多实例后,不能用chkconfig把mysqld_multi加入开机启动项。如果开机启动。可以
把以下命令加入/etc/rc.d/rc.local或.bashrc中:service mysqld_multi start
*********************************************************************************************
一、先按单实例安装。
二、增加实例:
1、停掉原mysqld服务,移除开机启动:
# service mysqld stop
# chkconfig --del mysqld
2、修改/etc/my.cnf,具体参附文,关键是:
-----------------------------------------------------------
[mysqld_multi]
mysqld = /usr/local/mysql/bin/mysqld_safe
mysqladmin = /usr/local/mysql/bin/mysqladmin
user = mysql
password = abc123
#注意这里user,使用mysql帐户启动。这个不是系统帐户,稍后会在MYSQL中创建并授权shutdown权限
#密码password是必须的,此帐户和密码将会由mysqladmin来调用。一会在mysql中创建用户后授予密码与此相同
[mysqld1]
port = 3306
socket = /usr/local/mysql/mysql.sock
pid-file = /usr/local/mysql/mysql.pid
datadir = /mysqldata
log-bin = /mysqldata/mysql-bin.log
log = /mysqldata/centos_3306.log
skip-name-resolve
# 如果有其它如innodb缓存等参数,接在本组下面写。
server-id = 1
[mysqld2]
#内容同上,但port,socket,pid-file,datadir,log等要不同。
port = 3307
socket = /usr/local/mysql/mysql_3307.sock
pid-file = /usr/local/mysql/mysql_3307.pid
#basedir = /usr/local/mysql
datadir = /mysqldata2
log-bin = /mysqldata2/mysql-bin.log
log = /mysqldata2/centos_3307.log #此日志看需要而定,建议取消。
skip-name-resolve
server-id = 2
...
[mysqldump]
....略
-----------------------------------------------------------
** 注意,每组的其它参数只能放在该组下,不能放在[mysqld_multi]下或其它地方。
3、为3307的新实例创建系统数据库。目录为/mysqldata2
# chown mysql.mysql -R /mysqldata2
# cd /usr/local/mysql
# scripts/mysql_install_db --datadir=/mysqldata2 --user=mysql
4、建立软链接到/usr/bin下,使命令调用简洁。
# ln -s /usr/local/mysql/bin/mysqld_multi /usr/bin/mysqld_multi
# ln -s /usr/local/mysql/bin/my_print_defaults /usr/bin/my_print_defaults
如果第二项my_print_defaults不做软链接,执行mysqld_multi可能会提示WARNING: my_print_defaults command not found错误。
5、启动多实例:
[root@centos62 mysql]# mysqld_multi start 1,2
[root@centos62 mysql]# mysqld_multi report
Reporting MySQL servers
MySQL server from group: mysqld1 is running
MySQL server from group: mysqld2 is running
注意:mysqld_multi 启动或关闭因调用mysqladmin,所以不会那么快,需等一会mysqld_multi report才能看到正确的结果。此命令用法参附文。
此时如果再执行mysqld_multi stop 1,2,然后用# mysqld_multi report,将仍会看到MYSQL实例仍在执行,这是因为还未在MYSQL中创建帐户。
所以mysqladmin还无法关闭。如果要在此时关闭,应执行# killall -15 mysqld
[root@centos62 mysql]# netstat -ltunp | grep 33 #查看端口
tcp 0 0 0.0.0.0:3307 0.0.0.0:* LISTEN 11900/mysqld
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 11895/mysqld
6、给新实例mysql2创建root的密码:
# mysqladmin -P3307 -uroot password '123456' -S /usr/local/mysql/mysql_3307.sock
7、现在进入MYSQL创建帐户并配密码。注意多实例进入MYSQL要加-S和-P(均大写)选项。
# mysql -uroot -p123456 -P3306 -S /usr/local/mysql/mysql.sock
mysql> create user mysql@localhost identified by 'abc123'; #密码'abc123'要和my.cnf中相同。
mysql> grant shutdown on *.* to mysql@localhost;
mysql > exit
再进入3307同样如上创建帐户和密码。确保每个实例均有和my.cnf中相同的帐户和密码。
# mysql -uroot -p123456 -P3307 -S /usr/local/mysql/mysql_3307.sock
mysql> ....(帐户创建同上,略。)....
【注:# mysql -uroot -p123456 -P3306 -S /usr/local/mysql/mysql.sock这里3306是默认端口,可省略-P3306,但其它实例不可略掉】
8、测试一下:
# mysqladmin -uroot -P3307 -p123456 shutdown -S /usr/local/mysql/mysql_3307.sock
# mysqladmin -uroot -P3306 -p123456 shutdown -S /usr/local/mysql/mysql.sock
9、把mysqld_multi复制到/etc/init.d/目录下。使命令service mysqld_multi start可用。
# cp bin/mysqld_multi /etc/init.d/mysqld_multi
# chmod 755 /etc/init.d/mysqld*
这样,以后不需再使用mysqld_multi start 1,2来启动了。直接使用service命令。
现在可以用更简单的办法启动:
# service mysqld_multi start 一次启动所有MYSQL实例
# service mysqld_multi stop 一次关闭所有MYSQL实例
10、加入启动项:
# vi /etc/rc.d/rc.local
添加一行:service mysqld_multi start
11、重启测试
# reboot
....重启..输入帐户和密码,重登录....查看....
# netstat -tlunp | grep mysql
tcp 0 0 0.0.0.0:3307 0.0.0.0:* LISTEN 2850/mysqld
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 2852/mysqld
至此,就创建了有两个而且数据库(含MYSQL系统库)均独立的MYSQL实例
12、远程登录,如192.168.1.100要登录:
进入新实例后:
mysql> create user root@192.168.1.100 identified by '123456';
Query OK, 0 rows affected (0.00 sec)
mysql> grant all on *.* to root@192.168.1.100;
如此即可,如果发现远程仍无法登录,可以在SELINUX和IPTABLES中加入新端口:
# semanage port -a -t mysqld_port_t -p tcp 3307
# iptables -I INPUT -p tcp --dport 3307 -j ACCEPT
# service iptables save
[root@centos62 ~]# iptables -L
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT all -- anywhere anywhere
ACCEPT tcp -- anywhere anywhere tcp dpt:opsession-prxy #3307
ACCEPT tcp -- anywhere anywhere tcp dpt:mysql #3306
ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
****************************************************************
** 关于mysqld_multi命令的语法:
****************************************************************
shell> mysqld_multi [options] {start|stop|report} [GNR[,GNR]...]
常用OPTIONS有:--user=mysql等,可不需要。
{start|stop|report}分别为{启动|关闭|报告状态},如上。
每一个GNR的值是my.cnf中组的序列号或是组的序列号范围。此项的值必须是组名字最后的数字,比如说如果组名为mysqld2,那么此项的值则为2.
如果指定一个范围,使用"-"(破折号)来连接二个数字。如GNR的值为10-13,则指组mysqld10到组mysqld13。
多个组或是组范围可以在命令行中指定,使用","(逗号)隔开。不能有空白的字符(如空格或tab),在空白字符后面的参数将会被忽略。
如:
shell> mysqld_multi stop 8,10-13 停止选项组[mysql8]和[mysqld10]至[mysqld13]:
shell> mysqld_multi --example 列出my.cnf示例文档。
shell> mysqld_multi start 1-2 --log=/home/mysqls.log 会在home目录下创建如下内容的日志:
Starting MySQL servers
120308 20:17:36 mysqld_safe Logging to '/mysqldata/centos62.err'.
120308 20:17:36 mysqld_safe Logging to '/mysqldata2/centos62.err'.
120308 20:17:36 mysqld_safe Starting mysqld daemon with databases from /mysqldata
120308 20:17:36 mysqld_safe Starting mysqld daemon with databases from /mysqldata2
启动信息仍记入各实例的数据目录下centos62.err中。
*********************************************************
mysqld_multi支持下面的选项:
· --config-file=name
指定选项文件名。这关系到mysqld_multi从哪里寻找[mysqldN]选项组。没有该选项,从通用my.cnf文件读所有选项。选项不影响 mysqld_multi从哪里读
取自己的选项,总是从通用my.cnf文件的[mysqld_multi]组读取。
· --example 显示示例选项文件。
· --help 显示帮助消息并退出。
· --log=name 指定日志文件名。如果该文件存在,后面为日志输出。
· --mysqladmin=prog_name 用来停止服务器的mysqladmin二进制。
· --mysqld=prog_name 可用的mysqld二进制。请注意你还可以将该选项的值指定为mysqld_safe。选项被传递给 mysqld。确保在PATH环境变量设定值或
mysqld_safe中有mysqld所在目录。
· --no-log 按照标准输出打印日志信息,不要写入日志文件。默认情况下,输出写入日志文件。
· --password=password 调用mysqladmin时使用的MySQL账户的密码。请注意该密码值不是可选项,不象其它MySQL程序。
· --silent 禁用警告。
· --tcp-ip 通过TCP/IP端口而不是Unix套接字文件来连接每个MySQL服务器。(如果找不到套接字文件, 服务器仍然可以运行,但只能通过 TCP/IP端口
访问)。默认情况下,使用Unix套接字文件进行连接。该选项影响stop和report操作。
· --user=user_name 调用mysqladmin时使用的MySQL账户的用户名。
· --verbose 更详细。
· --version 显示版本信息并退出。
*********************************************************
其它注意事项:
· 你可能想要为mysqld使用--user选项,但为此你需要用Unix root用户运行mysqld_multi脚本。选项文件中有选项不要紧;如果你不是超级用户,并且你用自己的Unix账户重启mysqld进程,你只会得到警告。
· 重要:确保mysqld进程启动所用Unix账户可以完全访问数据目录。不要使用Unix root账户,除非你知道你在做什么。
转自: