服务器:
MYCAT:192.168.1.124
主服务器:192.168.1.169
备服务器:192.168.1.150
tar -zxvf mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz
useradd mysql -r -s /sbin/nologin
mkdir -p /usr/local/mysql/mysql_files
mkdir -p /data/mysql_data{1..3}
chown root.mysql -R /usr/local/mysql
chown mysql.mysql -R /usr/local/mysql/mysql_files /data/mysql_data{1..3}
[mysqld_multi]
mysqld = /usr/local/mysql/bin/mysqld
mysqladmin = /usr/local/mysql/bin/mysqladmin
log = /tmp/mysql_multi.log
[mysqld1]
datadir = /data/mysql_data1 #设置数据目录
socket = /tmp/mysql.sock1 #设置sock文件存放路径
port = 3306 #设置监听开放端口
user = mysql #设置运行用户
performance_schema = off #关闭监控
innodb_buffer_pool_size = 32M #设置innodb 缓存大小
bind_address = 0.0.0.0 #设置监听IP地址
skip-name-resolve = 0 #关闭DNS反向解析
[mysqld2]
datadir = /data/mysql_data2
socket = /tmp/mysql.sock2
port = 3307
user = mysql
performance_schema = off
innodb_buffer_pool_size = 32M
bind_address = 0.0.0.0
skip-name-resolve = 0
[mysqld3]
datadir = /data/mysql_data3
socket = /tmp/mysql.sock3
port = 3308
user = mysql
performance_schema = off
innodb_buffer_pool_size = 32M
bind_address = 0.0.0.0
skip-name-resolve = 0
/usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql_data1
/usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql_data2
/usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql_data3
若缺失libaio
yum install -y libnuma
yum install -y libnuma.so.1
yum -y install numactl
cp /usr/local/mysql/support-files/mysqld_multi.server /etc/init.d/mysqld_multi
chmod +x /etc/init.d/mysqld_multi
chkconfig --add mysqld_multi
vim /etc/profile
export MYSQL_HOME=/usr/local/mysql
export PATH=${MYSQL_HOME}/bin:$PATH
source /etc/profile
mysqld_multi start
ss -tulpn|grep mysqld
连接实例1(主库):
mysql -S /tmp/mysql.sock1 -p 前面生成的密码
mysql> set password=password('123456');
mysql> flush privileges;
另外两个实例的操作方法与实例1一致,不再赘述。
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES;
启动时需要一个启动脚本,这个脚本一般在/usr/local/mysql/support-files
目录下mysqld_multi.server
,将这个脚本复制到init.d目录下
cp /usr/local/mysql/support-files/mysqld_multi.server /etc/rc.d/init.d/mysqld_multi
之后可以使用命令
/etc/rc.d/init.d/mysqld_multi start 1-3
启动三个MySQL实例,注意这里的数字和my.cnf
中的[mysqldN]
对应,1-3就是启动[mysqld1]
、[mysqld2]
、[mysqld3]
配置段的MySQL实例。
查看端口有没有正常启动
netstat -ano | egrep "3307|3308|3306"
查看端口,看MySQL有没有正常启动,如果没有启动或报错,一般报错详细日志存在各个实例data目录下的 主机名.err
文件中,打开此文件查找错误原因,逐步排错就可以了。
一般教程上关闭的命令是
/etc/rc.d/init.d/mysqld_multi stop 1-3
但是这个命令经常不起作用,所以一般我是用
killall -u mysql 或 kill -9 the-mysql-pid
主数据库master 需要添加
log-bin=mysql-bin
server-id=1
另外两个从数据库slave1 slave2只需要添加
关闭所有的mysql数据库并检查mysql数据的运行状态,重新运行所有的mysql数据
killall -u mysql
/etc/rc.d/init.d/mysqld_multi start 1-3
netstat -ano |egrep "3306|3307|3308"
打开master,输入密码,赋予从库权限账号,允许用户在主库上读取日志,赋予Slave机器有File权限,
mysql -S /tmp/mysql.sock1 -p
GRANT FILE ON *.* TO 'root'@'192.168.98.128' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'root'@'192.168.98.128' IDENTIFIED BY '123456';
FLUSH PRIVILEGES;
只赋予Slave机器有File权限还不行,还要给它REPLICATION SLAVE的权限才可以
退出主库master,再次重启mysql,进入主库master,查看主库信息
show master status;
退出主库master,分别进入另外两台从库slave1 和slave2,并执行下面的操作
change master to master_host='192.168.98.128',master_user='root',master_password='123456',master_log_file='mysql-bin.000002', master_log_pos=154;
其中 master_host对应的是主库的ip地址.master_user和master_password是主库的帐号和密码,master_log_file则是在主库查询到的二进制文件的名称,从库会自动查询到这个文件,master_log_pos是日志的位置.
接下来进行最后的测试,首先在主库创建一个数据库,如果从库能同样发现到该库的存在,则证明主从同步成功.
测试成功,如果发现新增的数据库没有出现,请先重启从库slave,之后可以看到新增的数据库了.
开放mysql的访问端口
/sbin/iptables -I INPUT -p tcp --dport 3306 -j ACCEPT
保存修改
/etc/rc.d/init.d/iptables save
重启防火墙使其改动生效
/etc/init.d/iptables restart
由于的mysql5.7中user表没有password字段,所以5.7之前的版本使用navicat等客户端无法正常登陆mysql,请使用以下方法解决此问题
打开相应的数据库,执行此sql命令,修改对应的帐号和密码,即可远程访问
ALTER USER 'root'@'%' IDENTIFIED BY '123456';
参考地址:https://www.liangzl.com/get-article-detail-2905.html