centos7 安装mysql5.7主从复制主写分离
centos7 两台
master IP:192.168.1.146
slave IP:192.168.1.147
1 下载mysql
下载后把安装包上传到服务器,也可以直接在服务器上用wget下载。
2 解压文件
#解压文件[root@localhost root]# tar -xzvf mysql-5.7.23-linux-glibc2.12-x86_64.tar.gz #将解压后的文件名改名为mysql,并移至/usr/local/目录下 [root@localhost root]# mv mysql-5.7.23-linux-glibc2.12-x86_64 /usr/local/mysql
3 配置文件
(1)配置mysql启动文件
若系统中无/etc/my.cnf文件,则需要创建
[root@localhost root]# touch /etc/my.cnf [root@localhost root]# vim /etc/my.cnf
添加以下内容
[mysql] default-character-set=utf8 [mysqld] default-storage-engine=INNODB character_set_server=utf8
(2)复制mysql.server到/etc/init.d/目录下(目的想实现开机自动执行效果)
[root@localhost root]# cd /usr/local/mysql/support-files/ [root@localhost support-files]# cp mysql.server /etc/init.d/mysql
(3)修改/etc/init.d/mysql参数
[root@localhost support-files]# vim /etc/init.d/mysql
修改以下内容
basedir=/usr/local/mysql datadir=/usr/local/mysql/data
(4)创建一个操作数据库的专门用户(出于安全)
建立一个mysql的组 [root@localhost support-files]# groupadd mysql
建立mysql用户,并且把用户放到mysql组
[root@localhost support-files]# useradd -r -g mysql mysql
为mysql用户设置密码
[root@localhost support-files]# passwd mysql
给目录/usr/local/mysql 更改拥有者
[root@localhost support-files]# chown -R mysql:mysql /usr/local/mysql/
4 安装初始化mysql
[root@localhost support-files]# cd /usr/local/mysql/bin/ [root@localhost bin]# ./mysqld --initialize --user=mysql --basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data
#注意:若报libaio错,则yum install -y libaio
#注意:若报无/usr/local/mysql/data目录,则需自行创建
#初始化后会生成一个临时密码 root@localhost::*(最好先记录这个临时密码)
给数据库加密
[root@localhost bin]# ./mysql_ssl_rsa_setup --datadir=/usr/local/mysql/data/
启动mysql
#启动mysql,如果mysqld进程异常终止,mysqld_safe将自动重启mysqld
[root@localhost bin]# ./mysqld_safe --user=mysql &
#检查mysql是否启动
[root@localhost bin]# ps -ef|grep mysql
#5 修改密码
#进入客户端
[root@localhost bin]# ./mysql -uroot -p Enter password:这里输入之前的临时密码 #修改密码 mysql> set password=password('新密码');
#6 设置远程访问
(1)打开mysql的默认端口3306
#设置3306为开放端口
[root@localhost bin]# firewall-cmd --zone=public --add-port=3306/tcp --permanent
#重新加载防火墙
[root@localhost bin]# firewall-cmd --reload
(2)设置mysql的远程访问
#设置远程访问账号,若最后加上with grant option,则同时可以赋予权限的权限
mysql> grant all privileges on *.* to root@'%' identified by '密码'; #刷新 mysql> flush privileges;
设置远程访问参数说明
grant [previleges] on [dbName].[tableName] to [userName]@[hostName] identified by "password"; previlege:授予的权限,有select,insert,update,delete,create,drop,index,alter,grant,references,reload,shutdown,process,file等14个权限,若all则表示赋予所有权限; dbName:指定被访问的数据库名称,如果指定所有数据库可使用*星号; tableName:指定被访问的数据表,如果指定某个数据库下的所有数据表可使用*星号; userName:远程主机的登录用户名称; hostName:远程主机名或者IP地址,%为所有主机均可登陆; password:远程主机用户访问MySQL使用的密码。
7 设置开机自启动
(1)添加mysql服务
[root@localhost bin]# chkconfig --add mysql
(2)设置mysql服务为自启动
[root@localhost bin]# chkconfig mysql on
8 配置环境变量
[root@localhost bin]# vim /etc/profile
在最后一行加入以下内容
export PATH=/usr/local/mysql/bin:$PATH
使修改生效
[root@localhost bin]# source /etc/profile
至此,mysql5.7在linux的安装则完成啦!!
mysql 主从复制配置
8 master主服务器的配置
8.1 配置文件my.cnf的修改
[root@localhost mysql]# vim /etc/my.cnf
在[mysqld]中添加:
server-id=1 log_bin=master-bin log_bin_index=master-bin.index binlog_do_db=test
>备注: >server-id 服务器唯一标识。 >log_bin 启动MySQL二进制日志,即数据同步语句,从数据库会一条一条的执行这些语句。 >binlog_do_db 指定记录二进制日志的数据库,即需要复制的数据库名,如果复制多个数据库,重复设置这个选项即可。 >binlog_ignore_db 指定不记录二进制日志的数据库,即不需要复制的数据库名,如果有多个数据库,重复设置这个选项即可。 >其中需要注意的是,binlog_do_db和binlog_ignore_db为互斥选项,一般只需要一个即可。
8.2 创建从服务器的用户和权限
进入mysql数据库
[root@localhost mysql]# mysql -uroot -p Enter password: #创建从数据库的masterbackup用户和权限 mysql> grant replication slave on *.* to masterbackup@'192.168.1.%' identified by '123456'; #备注 #192.168.1.%通配符,表示0-255的IP都可访问主服务器,正式环境请配置指定从服务器IP #若将 192.168.1.% 改为 %,则任何ip均可作为其从数据库来访问主服务器 #退出mysql mysql> exit;
8.3 重启mysql服务
[root@localhost mysql]# service mysql restart Shutting down MySQL.... SUCCESS! Starting MySQL. SUCCESS!
8.4 查看主服务器状态
#进入mysql数据库 [root@localhost mysql]# mysql -uroot -p Enter password:
查看主服务器状态
mysql> show master status; +-------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +-------------------+----------+--------------+------------------+-------------------+ | master-bin.000001 | 154 | test | | | +-------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)
9 slave从服务器的配置
9.1 配置文件my.cnf的修改
编辑my.cnf文件
[root@localhost mysql]# vim /etc/my.cnf #在[mysqld]中添加: server-id=2 relay-log=slave-relay-bin relay-log-index=slave-relay-bin.index #replicate-do-db=test #备注: #server-id 服务器唯一标识,如果有多个从服务器,每个服务器的server-id不能重复,跟IP一样是唯一标识,如果你没设置server-id或者设置为0,则从服务器不会连接到主服务器。 #relay-log 启动MySQL二进制日志,可以用来做数据备份和崩溃恢复,或主服务器挂掉了,将此从服务器作为其他从服务器的主服务器。 #replicate-do-db 指定同步的数据库,如果复制多个数据库,重复设置这个选项即可。若在master端不指定binlog-do-db,则在slave端可用replication-do-db来过滤。 #replicate-ignore-db 不需要同步的数据库,如果有多个数据库,重复设置这个选项即可。 #其中需要注意的是,replicate-do-db和replicate-ignore-db为互斥选项,一般只需要一个即可。
9.2 重启mysql服务
[root@localhost mysql]# service mysql restart Shutting down MySQL.... SUCCESS! Starting MySQL. SUCCESS!
9.3 连接master主服务器
进入mysql数据库
[root@localhost mysql]# mysql -uroot -p Enter password:
连接master主服务器
mysql> change master to master_host='192.168.1.146',master_port=3306,master_user='masterbackup',master_password='123456',master_log_file='master-bin.000001',master_log_pos=154; #备注: #master_host对应主服务器的IP地址。 #master_port对应主服务器的端口。 #master_log_file对应show master status显示的File列:master-bin.000001。 #master_log_pos对应show master status显示的Position列:154。
9.4 启动slave数据同步
启动slave数据同步
mysql> start slave;
停止slave数据同步(若有需要)
mysql> stop slave;
9.5 查看slave信息
mysql> show slave status\G;
Slave_IO_Running和Slave_SQL_Running都为yes,则表示同步成功。
10 测试
在主服务器上登陆mysql,且进入test数据库,创建test表,且插入一条数据
create table test(id int(11) AUTO_INCREMENT, primary key comment '主键ID',title varchar(50) not null comment '标题'); #插入一条数据 insert into test(id,title) values(null,'我是标题');
在从服务器上登陆mysql,且进入test数据库
发现数据已经同步;
#11 可能会遇到的错误:
若在主从同步的过程中,出现其中一条语句同步失败报错了,则后面的语句也肯定不能同步成功了。例如,主库有一条数据,而从库并没有这一条数据,然而,在主库执行了删除这一条数据的操作,那么从库没有这么一条数据就肯定删除不了,从而报错了。在此时的从数据库的数据同步就失败了,因此后面的同步语句就无法继续执行。
#####这里提供的以下几种方法:
方法一:
该方法适用于主从库数据相差不大,或者要求数据可以不完全统一的情况,数据要求不严格的情况 解决: stop slave; #表示跳过一步错误,后面的数字可变 set global sql_slave_skip_counter =1; start slave; 之后再用mysql> show slave status\G 查看: Slave_IO_Running: Yes Slave_SQL_Running: Yes ok,现在主从同步状态正常了。。。
方式二:指定跳过错误代码,继续同步
主键冲突、表已存在等错误代码如1062,1032,1060等,可以在mysql主配置文件指定略过此类异常并继续下条sql同步,这样也可以避免很多主从同步的异常中断 [mysqld] slave-skip-errors = 1062,1032,1060 重新启动mysql service mysqld restart 之后再用mysql> show slave status\G 查看: Slave_IO_Running: Yes Slave_SQL_Running: Yes
方式三:重新做主从,完全同步
该方法适用于主从库数据相差较大,或者要求数据完全统一的情况
解决步骤如下:
1.先进入主库,进行锁表,防止数据写入
使用命令:
mysql> flush tables with read lock; 注意:该处是锁定为只读状态,语句不区分大小写
2.进行数据备份
把数据备份到mysql.bak.sql文件
[root@server01 mysql]#mysqldump -uroot -p -hlocalhost > mysql.bak.sql 这里注意一点:数据库备份一定要定期进行,可以用shell脚本或者python脚本,都比较方便,确保数据万无一失
3.查看master 状态
mysql> show master status; +-------------------+----------+--------------+-------------------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +-------------------+----------+--------------+-------------------------------+ | mysqld-bin.000001 | 3260 | | mysql,test,information_schema | +-------------------+----------+--------------+-------------------------------+ 1 row in set (0.00 sec)
4.把mysql备份文件传到从库机器,进行数据恢复
#使用scp命令 [root@server01 mysql]# scp mysql.bak.sql root@192.168.1.147:/tmp/
5.停止从库的状态
mysql> stop slave;
6.然后到从库执行mysql命令,
导入数据备份mysql> source /tmp/mysql.bak.sql
7.设置从库同步,注意该处的同步点,就是主库show master status信息里的| File| Position两项
change master to master_host = '192.168.1.146', master_user = 'rsync', master_port=3306, master_password='', master_log_file = 'mysqld-bin.000001', master_log_pos=3260;
8.重新开启从同步
mysql> stop slave;
9.查看同步状态
mysql> show slave status\G 查看: Slave_IO_Running: Yes Slave_SQL_Running: Yes
一般在线增加从库有两种方式,一种是通过mysqldump备份主库,恢复到从库,mysqldump是逻辑备份,数据量大时,备份速度会很慢,锁表的时间也会很长。另一种是通过xtrabackup工具备份主库,恢复到从库,xtrabackup是物理备份,备份速度快,不锁表。为什么不锁表?因为自身会监控主库日志,如果有更新的数据,就会先写到一个文件中,然后再回归到备份文件中,从而保持数据一致性。