一、问题情况
因同一台服务器需要开多个主从库,不能把库放在相同的mysql实例里,只能多开多个实例,在此记录下实现方法
二、解决办法
1.准备工作:
1 |
mysql -V |
首先我们要查看一下当前服务器上面的Mysql的版本,因为5.7.6之后mysql初始化数据库使用的是mysqld,5.6及以前的版本是使用的mysql_install_db初始化数据库
2.复制my.cnf配置文件:
1 |
cp /etc/my.cnf /etc/my3307.cnf |
文件名可以根据自己的喜好命名,我是以将要新开的端口来命名。
3.修改配置文件:
对应参数修改如下:
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 |
4.初始化数据库:
(1)5.6及以前版本初始化:
1 2 |
cd /usr/local/mysql/scripts/ ./mysql_install_db --user=mysql --basedir=/usr/local/mysql --defaults-file=/etc/my3307.cnf |
参数解读:--basedir为mysql安装目录,--defaults-file为刚修改的配置文件,mysql_install_db文件有些版本的数据库是在scripts目录下,如果这个目录下没有就看下bin目录文件试是否存在。
(2)5.7及以后版本初始化:
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 9 |
--defaults-file:指定配置文件,该参数必须放在第一个,不然会报错 --user :以用户身份运行mysqld服务 --basedir :安装目录的路径 --datadir :数据库根目录的路径 --initialize-insecure :无限制,无临时密码(推荐) --initialize 参数功能: 对于密码复杂度进行定制 密码过期时间,默认180天 给root@localhost用户设置临时密码 |
5.启动3307数据库:
1 |
/usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my3307.cnf 2>&1 >/dev/null & |
5.6及以下版本数据库密码默认为空,登录成功,修改为自己的密码即可
6.数据库登录:
(1)sock方式:
1 |
mysql -S /tmp/mysql3307.sock -u root -p |
(2)端口方式:
1 |
mysql -h 127.0.0.1 -P 3307 -u root -p |
7.设置多端口mysql服务脚本:
设置多端口mysql服务脚本,方便我们启动关闭数据库,
1 |
vim /etc/init.d/mysqlp |
脚本内容如下:
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 |
#!/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 |
8.修改脚本权限:
1 |
chmod +x /etc/init.d/mysqlp |
9.操作命令:
1 2 3 |
service mysqlp 3307 start service mysqlp 3307 stop service mysqlp 3307 restart |
其他端口命令同上比如3308,3309之类.