更多博文请关注:没有伞的孩子必须努力奔跑(www.xuchanggang.cn)在我们的生产环境中,很少一台dbserver就一个mysql实例,从节约成本和充分利用资源的角度出发,
更多博文请关注:没有伞的孩子必须努力奔跑 ()
在我们的生产环境中,很少一台db server就一个mysql实例,从节约成本和充分利用资源的角度出发,我们往往会在主从环境下,对从机的db server 安装多个mysql实例,用来同步主db server的相应实例
1.mysql 多实例的控制原理:
多实例通过Mysqld_multi 可以管理多个监听不同的 unix 套字节文件和 TCP/IP 端口的连接的 mysqld 进程,包括 start,stop,status。
默认的 mysqld_multi 是读取 my.cnf 中的[mysqld/N]中的数据,N 一定是正整数,如果你是单独写的文件,可以通过--config-file 参数来指定读取的 configfile。
mysqld_multi 的 option
usage:
myysqld_multi [optinos] {start|stop|report} [GNR[,GNR]..]
option:
start|stop |reportGNR 指的是[msyqld/N]中的 N,GNR 中不能有空格和 tab
mysqld_multi start 10 就是启动 my.cnf 中的 10 的实例;mysqld_multi start 1,4-6 就是启动 1,4 到 6 个实例
如果任何参数都不加入的话,,默认会启动所有的实例
登陆会话,则指定对应mysq实例的套接字文件:mysql -uuser -ppassword -S sockpath
2.下面我们简单搭建一台DB server启动两个mysql实例[主从同步,会在下一篇文章中搭建]
(1).我默认在这台DB server上已经安装一个mysql 实例[ 我这里是源码安装的mysql,各位可以采用RPM、二进制、源码等方式安装一个mysql ]
数据库安装目录:/usr/local/mysql
3306实例数据存放目录:/home/mysql/data
(2).新建第二个mysql实例数据存放目录,目录名为:data_3307
[root@client100 mysql]# mkdir -p /home/mysql/data_3307 # 修改数据目录的属主 [root@client100 mysql]# chown mysql. -R /home/mysql/data_3307(3).编辑数据库配置文件:/etc/my.cnf
[root@client100 mysql]# vim /etc/my.cnf [mysqld_multi] # 指定相关命令的路径 mysqld = /usr/local/mysql/bin/mysqld_safe mysqladmin = /usr/local/mysql/bin/mysqladmin # 指定用户,用于启动和关闭mysql服务[这里尽量使用root用户,默认root用户拥有所以权限,记得在两个实例中root密码一致] user = root password = kongzhong # 指定错误日志路径 log = /usr/local/mysql/multi.log [mysqld3306] basedir =/usr/local/mysql datadir =/home/mysql/data socket = /usr/local/mysql/mysqld3306.sock pid-file = /home/mysql/data/mysql3306.pid general_log = 1 general_log_file = /home/mysql/data/mysql3306.log port =3306 server_id =100 user = mysql join_buffer_size = 128M sort_buffer_size = 2M read_rnd_buffer_size = 2M default_storage_engine = MYISAM join_buffer_size = 128M max_allowed_packet= 1M net_buffer_length= 8K skip-external-locking skip-host-cache skip-name-resolve # InnoDB innodb_buffer_pool_size = 128M innodb_log_file_size = 48M innodb_file_per_table = 1 innodb_flush_method = O_DIRECT # MyISAM key_buffer_size = 48M character-set-server=utf8 collation-server=utf8_general_ci # LOG log_error = /home/mysql/data/mysql-error.log long_query_time = 1 slow-query-log slow_query_log_file = /home/mysql/data/mysql-slow.log # Others explicit_defaults_for_timestamp=true max_connections = 500 open_files_limit = 65535 sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES [mysqld3307] basedir =/usr/local/mysql datadir =/home/mysql/data_3307 socket = /usr/local/mysql/mysqld3307.sock pid-file = /home/mysql/data_3307/mysql3307.pid general_log = 1 general_log_file = /home/mysql/data_3307/mysql3307.log port =3307 server_id =101 user = mysql join_buffer_size = 128M sort_buffer_size = 2M read_rnd_buffer_size = 2M default_storage_engine = MYISAM join_buffer_size = 128M max_allowed_packet= 1M net_buffer_length= 8K skip-external-locking skip-host-cache skip-name-resolve # InnoDB innodb_buffer_pool_size = 128M innodb_log_file_size = 48M innodb_file_per_table = 1 innodb_flush_method = O_DIRECT # MyISAM key_buffer_size = 48M character-set-server=utf8 collation-server=utf8_general_ci # LOG log_error = /home/mysql/data_3307/mysql-error.log long_query_time = 1 slow-query-log slow_query_log_file = /home/mysql/data_3307/mysql-slow.log # Others explicit_defaults_for_timestamp=true max_connections = 500 open_files_limit = 65535 sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES(4).为第二个实例初始化数据库:
# 进入数据库安装目录 [root@client100 mysql]# cd /usr/local/mysql/scripts/ # 执行初始化脚本,指定数据目录/用户 [root@client100 scripts]# ./mysql_install_db --basedir=/usr/local/mysql --datadir=/home/mysql/data_3307 --user=mysql(5).使用mysqld_multi命令启动相应实例[如果my.cnf不在默认位置,需指明位置--defaults-extra-file=****]
# 启动相应实例 [root@client100 ~]# mysqld_multi start 3306 [root@client100 ~]# mysqld_multi start 3307 # 使用如下命令检测 mysql 相应实例进程是否启动 [root@client100 ~]# ps -ef |grep mysql # 使用netstat 检测mysql两个实例端口是否启动[看到两个端口的监听都出现,就说明搭建正常] [root@client100 ~]# netstat -ntlp |grep mysql # 使用如下两条命令,可登陆到对应实例数据库 [root@client100 ~]# mysql -uroot -S /usr/local/mysql/mysqld3306.sock -p [root@client100 ~]# mysql -uroot -S /usr/local/mysql/mysqld3307.sock -p # 登陆后,可查看参数,查看数据存放目录,以确认是否登陆自己要登陆的实例 mysql> show variables like '%datadir%' # 关闭实例 [root@client100 ~]# mysqld_multi stop 3306 [root@client100 ~]# mysqld_multi stop 3307 # 如果执行以上命令,不能关闭的话,请使用以下方式关闭 [root@client100 ~]# mysqladmin -uroot -p -S /usr/local/mysql/mysqld3307.sock shutdown [root@client100 ~]# mysqladmin -uroot -p -S /usr/local/mysql/mysqld3306.sock shutdown ## 有的朋友可能在使用 mysqld_multi stop 关闭时,始终有实例关闭不了,这里就是/etc/my.cnf中user/password的作用 ## 需要做如下操作: ## 如果你指定的用户不是root用户,那最好拥有mysql的所有目录权限,不然会报权限不够,所以建议用mysql或root用户 ## 如果是root用户,因为root拥有所有权限,所以只要设置两个实例的密码都是一样的就行 ## 而对于mysql,则编译安装时,创建用户是就要允许此用户登录,即不要加nologin限制 ## 并登录到实例数据库后,授予shutdown权限,设置密码 mysql> GRANT SHUTDOWN ON *.* TO 'mysql'@'localhost' IDENTIFIED BY 'kongzhong'; mysql> flush privileges ## 现在再用 mysqld_multi stop 关闭,就可正常关闭[还是那句,建议用root]本文出自 “没有伞的孩子必须努力奔跑” 博客,请务必保留此出处