一、问题情况
因为需要一台物理服务器跑多个网站,有些网站数据库还需要主从,所以需要多个实例来运行mysql数据库。
二、教程说明
首先要看下mysql的版本是5.6还是5.7,因为5.7.6之后mysql只能使用mysqld初始化数据库,之前可以用mysql_install_db初始化数据库
1 |
mysql -V |
首先复制一份3306端口的mysql配置文件出来(新实例端口我们使用3307,如果多开可以一次类推3308/3309...)
1 |
cp /etc/my.cnf /etc/my3307.cnf |
接着修改刚复制出来的mysql配置文件
1 2 3 4 5 6 7 8 9 10 |
vim /etc/my3307.cnf [client] port = 3307 socket = /tmp/mysql3307.sock [mysqld] port = 3307 socket = /tmp/mysql3307.sock datadir = /usr/local/mysql/var3307 innodb_data_home_dir = /usr/local/mysql/var3307 innodb_log_group_home_dir = /usr/local/mysql/var3307 |
5.6及以前版本可以使用下面命令初始化数据库--basedir为mysql安装目录,--defaults-file为刚修改的配置文件,网上有写用--datadir指定初始化数据库目录的,测试发现会提示3306实例目录的innodb文件正在被占用,安全起见还是修改好配置文件里的目录直接指定配置文件初始化比较好,如果scripts下没有可以看下bin里是否有mysql_install_db
1 2 |
cd /usr/local/mysql/scripts/ ./mysql_install_db --defaults-file=/etc/my3307.cnf --user=mysql --basedir=/usr/local/mysql |
初始化完成以后可以使用下面命令启动3307数据库
1 |
/usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my3307.cnf 2>&1 >/dev/null & |
启动以后可以用sock方式或者端口方式登录3307数据库(初始化后root密码为空)
sock方式:
1 |
mysql -S /tmp/mysql3307.sock -u root -p |
端口方式(需要指定服务器-h,端口是大写-P):
1 |
mysql -h 127.0.0.1 -P 3307 -u root -p |
5.7及以后版本可以用mysqld初始化数据库(--defaults-file要放第一个选项)
1 |
/usr/local/mysql/bin/mysqld --defaults-file=/etc/my3307.cnf --initialize-insecure --user=mysql --basedir=/usr/local/mysql |
MySQL5.7使用mysqld命令初始化数据,--initialize-insecure 或 --initialize参数可以定制密码复发度、有效期,并指定是否为root@localhost用户设置临时密码
1 2 3 4 5 6 7 8 |
--user :以用户身份运行mysqld服务 --basedir :安装目录的路径 --datadir :数据库根目录的路径 --initialize-insecure :无限制,无临时密码(推荐) --initialize 参数功能: 对于密码复杂度进行定制 密码过期时间,默认180天 给root@localhost用户设置临时密码 |
服务启动后,由于多个实例重启没有自带的服务脚本所以这里提供一个多端口mysql服务脚本,需注意下sock和cnf名称必须是用端口号命名才行.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
vim /etc/init.d/mysqlp #!/bin/sh [ -f /etc/init.d/functions ]&&. /etc/init.d/functions||exit #Define Variables Port=$1 Mysql_sock=/tmp/mysql${Port}.sock Path=/usr/local/mysql/bin RETVAL=0 Defaults_file=/etc/my${Port}.cnf #Define Start Function start() { if [ ! -e "$Mysql_sock" ];then /bin/sh $Path/mysqld_safe --defaults-file=$Defaults_file 2>&1 >/dev/null & RETVAL=$? if [ $RETVAL -eq 0 ];then action "Starting $Port MySQL..." /bin/true else action "Starting $Port MySQL..." /bin/false fi else echo "$Port MySQL is Running..." fi return $RETVAL } #Define Stop Function stop() { if [ ! -e "$Mysql_sock" ];then echo "$Port MySQL is Stopped..." else Mysql_datadir=`sed -n -r 's/.*datadir.*=[[:space:]](.*).*/\1/p' $Defaults_file` Mysqld_pid_file_path=$Mysql_datadir/`hostname`.pid Mysqld_pid=`cat "$Mysqld_pid_file_path"` kill $Mysqld_pid RETVAL=$? if [ $RETVAL -eq 0 ];then action "Stopping $Port MySQL..." /bin/true else action "Stopping $Port MySQL..." /bin/false fi fi return $RETVAL } case "$2" in start) start RETVAL=$? ;; stop) stop RETVAL=$? ;; restart) stop while [ -f "$Mysqld_pid_file_path" ] do sleep 1 done start RETVAL=$? ;; *) echo -e "USAGE:$0 {3307|3308|3309|...} {start|stop|restart}" RETVAL=2 ;; esac exit $RETVAL |
保存好以后要给服务脚本可执行权限
1 |
chmod +x /etc/init.d/mysqlp |
后面启动关闭重启其他端口mysql可以用以下命令
1 2 3 |
service mysqlp 3307 start service mysqlp 3307 stop service mysqlp 3307 restart |