centos7 Mysql5.7.15版本 一主一备架构(生产环境带数据,不锁库)
1、概述 场景:生产线上,有一个MySQL数据库,为了安全,领导想给它做成主备架构,添加一个备库来做实时数据同步。 在操作之前需要考虑的问题: 如果有条件的话,获取生产库上,操作系统及数据库安装文档,认真观看,有没有对系统及数据库做一些特殊的配置。 (1)操作系统方面: 是否设置主机名; 配置静态IP地址; 使用与主库一样的操作系统; 操作系统所使用的字符集; 主库操作系统有没有作其他更改。 (2)MySQL数据库方面: 获取主库的my.cnf,备库配置文件要根据主库的my.cnf进行相应的配置; 数据库将使用哪一类字符集,后期更改字符集是比较痛苦的事; server_id不建议使用1,唯一值; 日常主库使用什么工具进行备份,如果要求不锁表,建议使用percona-xtrabackup对主库进行全备;如果可以锁表,可以使用mysqldump进行备份。 怎样将主库的备份文件传输到备库上,能否使用scp。 2、所需软件 3、备库MySQL软件的安装 3.1、查询服务器上是否已经安装mysql 1 #rpm-aq|grepmariadb 3.2、先卸载旧的版本 如果是生产环境,请谨慎卸载,这个包可能会影响其它软件的使用,如果不卸载,安装mysql5.7会报错,即安装不了。 卸载旧版本mariadb 1 rpm-emariadb-libs --nodeps 3.3、安装软件 //新建msyql用户禁止登录shell 1 2 groupaddmysql useradd-r-s/sbin/nologin-gmysqlmysql 解压 1 tarxvfmysql-5.7.15-1.el7.x86_64.rpm-bundle.tar 安装软件 1 2 3 4 5 6 7 8 rpm-ivfmysql-community-common-5.7.15-1.el7.x86_64.rpm rpm-ivfmysql-community-libs-5.7.15-1.el7.x86_64.rpm rpm-ivfmysql-community-libs-compat-5.7.15-1.el7.x86_64.rpm rpm-ivfmysql-community-client-5.7.15-1.el7.x86_64.rpm rpm-ivfmysql-community-embedded-5.7.15-1.el7.x86_64.rpm rpm-ivfmysql-community-devel-5.7.15-1.el7.x86_64.rpm rpm-ivfmysql-community-embedded-devel-5.7.15-1.el7.x86_64.rpm rpm-ivfmysql-community-server-5.7.15-1.el7.x86_64.rpm // mysql-community-test依赖perl,需要安装perl-Data-Dumper与perl(JSON) 1 2 3 yuminstallperl-Data-Dumperperl-JSON-y rpm-ivfmysql-community-test-5.7.15-1.el7.x86_64.rpm rpm-ivfmysql-community-embedded-compat-5.7.15-1.el7.x86_64.rpm 3.4、MySQL 5.7.15修改密码 1 /bin/systemctlstartmysqld.service 查看密码 1 2 sudogrep 'temporarypassword' /var/log/mysqld.log mysql-uroot-p//输入上条命令查看到的密码 进入mysql,修改密码 1 mysql> set password = password ( '123456' );mysql>flush privileges ; 设置开机启动 1 systemctlenablemysqld 3.5、开启mysql的3306端口号,给root用户授权,用于远程访问 3.5.1、永久关闭iptables与Selinux 关闭防火墙 1 2 systemctlstopfirewalld systemctldisablefirewalld 临时关闭Selinux 1 setenforce0 永久关闭Selinux 1 sed-i '/SELINUX/s/enforcing/disabled/' /etc/selinux/config 重启系统生效 3.5.2、给root用户授权,使远程客户端才能够连接过来 1 mysql> GRANT ALL PRIVILEGES ON *.* TO 'root' @ '%' IDENTIFIED BY '123456' WITH GRANT OPTION ;mysql>flush privileges ; 3.6、修改备服务器slave的配置文件my.cnf 参考主服务器的配置文件进行相应的配置。 先关闭数据库 1 systemctlstopmysqld 修改配置文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #vi/etc/my.cnf[client] default - character - set =gbk[mysqld] character - set -server=gbk log_bin=slave-bin log_bin_index=slave-bin. index basedir=/usr datadir=/var/lib/mysql port=3306server_id=178socket=/var/lib/mysql/mysql.sock relay_log=relay-log relay_log_index=relay-log. index skip- name -resolve max -connections=1000default-storage-engine=InnoDBlong_query_time=1slow_query_log_file=/var/lib/mysql/mysql_slow_query.log binlog_format=row #Disablingsymbolic-links is recommended to preventassortedsecurityriskssymbolic-links=0 log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid 3.7、重启备库服务器的mysql 1 systemctlstartmysqld 4、主备复制配置步骤如下 4.1、对主库进行全备 使用percona-xtrabackup对主数据库进行全备份: 安装percona-xtrabackup软件 安装相关依赖包: 关于libev:可以去这个地址下载: http://mirrors.yun-idc.com/epel/6/x86_64/libev-4.03-3.el6.x86_64.rpm 1 yuminstalllibev 安装Percona-XtraBackup 1 2 3 4 tarxvfPercona-XtraBackup-2.4.4-rdf58cf2-el7-x86_64-bundle.tar yuminstallpercona-xtrabackup-24-2.4.4-1.el7.x86_64.rpm rpm-ivfpercona-xtrabackup-24-debuginfo-2.4.4-1.el7.x86_64.rpm rpm-ivfpercona-xtrabackup-test-24-2.4.4-1.el7.x86_64.rpm 在/tmp/建立backup文件存放备份数据库: 1 #cd/tmp#mkdirbackup 使用以下命令进行全备份: 1 innobackupex --user=root--password=123456/tmp/backup/innobackupex--use-memory=500m--apply-log/tmp/backup/2016-03-14_11-26-07/ 4.2、将备份好的文件传输到备库上,执行恢复 先停备库(备库操作) 1 systemctlstopmysqld 主库操作: 主库进入/tmp/backup/2016-03-14_11-26-07/目录把备份的目录拷贝到备服务器上,放入备服务器数据库目录下(即:/var/lib/mysql) 1 scp-r*192.168.1.178:/var/lib/mysql/ 对/var/lib/mysql下的文件属组进行更改: 备库执行以下操作: 1 2 cd/var/lib/mysql chown-Rmysql.mysql* 重新启动备库mysql服务: 1 systemctlstartmysqld 4.3、在主服务器上建立帐户并授权 1 2 #mysql-uroot-pEnter password : mysql> grant replicationslave on *.* to apexsoft@ '192.168.1.178' identified by '123456' ;mysql>flush privileges ; 4.4、在备库上查看数据库已经同步到什么时候 进入/var/lib/mysql/查看xtrabackup_binlog_info 1 #catxtrabackup_binlog_infomaster-bin.000001865 4.5、配置备服务器Slave 1 mysql>changemaster to master_host= '192.168.1.173' ,master_user= 'apexsoft' ,master_password= '123456' ,master_log_file= 'master-bin.000001' ,master_log_pos=865; 如果在一个机器多个实例上,可能需要指定端口号或者修改了mysql 默认端口号,在配置主备复制的时候需要加上MASTER_PORT=3306; 启动备服务器复制功能 1 mysql>startslave; 4.6、检查备库服务器复制功能状态 1 mysql>showslavestatus\G;***************************1.row***************************Slave_IO_State:Waiting for master to sendeventMaster_Host:192.168.1.173//主服务器地址Master_User:apexsoft//授权帐户名,尽量避免使用rootMaster_Port:3306//数据库端口,部分版本没有此行Connect_Retry:60Master_Log_File:master-bin.000001Read_Master_Log_Pos:865//#同步读取二进制日志的位置,大于等于>=Exec_Master_Log_PosRelay_Log_File:relay-log.000002Relay_Log_Pos:284Relay_Master_Log_File:master-bin.000001Slave_IO_Running:Yes//此状态必须YESSlave_SQL_Running:Yes//此状态必须YESReplicate_Do_DB:Replicate_Ignore_DB:Replicate_Do_Table:Replicate_Ignore_Table:Replicate_Wild_Do_Table:Replicate_Wild_Ignore_Table:Last_Errno:0Last_Error:Skip_Counter:0Exec_Master_Log_Pos:322Relay_Log_Space:451Until_Condition:NoneUntil_Log_File:Until_Log_Pos:0Master_SSL_Allowed: No 1 2 3 4 Master_SSL_CA_File:Master_SSL_CA_Path:Master_SSL_Cert:Master_SSL_Cipher:Master_SSL_Key:Seconds_Behind_Master:0Master_SSL_Verify_Server_Cert: No Last_IO_Errno:0Last_IO_Error:Last_SQL_Errno:0Last_SQL_Error:Replicate_Ignore_Server_Ids:Master_Server_Id:1Master_UUID:dcc7a60f-2c1d-11e5-ad33-000c29133345Master_Info_File:/usr/ local /mysql/data/master.info SQL_Delay:0SQL_Remaining_Delay: NULL Slave_SQL_Running_State:Slavehas read all relaylog;waiting for theslaveI/Othread to update it Master_Retry_Count:86400Master_Bind:Last_IO_Error_Timestamp:Last_SQL_Error_Timestamp:Master_SSL_Crl:Master_SSL_Crlpath:Retrieved_Gtid_Set:Executed_Gtid_Set:Auto_Position:01row in set (0.00sec) 注:Slave_IO及Slave_SQL进程必须正常运行,即YES状态,否则都是错误的状态(如:其中一个NO均属错误)。以上操作过程,主备服务器配置完成。 可以在主服务器上查看备库服务器连接状态: 1 showprocesslist; 4.7、验证主备架构是否搭建成功 主服务器Mysql,建立数据库,并在这个库中建表插入一条数据: 1 2 mysql> create database apex_db;QueryOK,1rowaffected(0.00sec)mysql>useapex_db; Database changed mysql> create table apex_tb(id int (3), name char (10));QueryOK,0 rows affected(0.00sec)mysql> insert into apex_tb values (001, 'apex' );QueryOK,1rowaffected(0.00sec)mysql>showdatabases;+ --------------------+|Database|+--------------------+|information_schema||apex_db||mysql||test|+--------------------+4rowsinset(0.00sec) 备库服务器Mysql查询: 1 2 mysql>showdatabases;+ --------------------+|Database|+--------------------+|information_schema||apex_db||mysql||test|+--------------------+4rowsinset(0.00sec)mysql>useapex_dbDatabasechanged mysql> select * from apex_tb;//可以看到在主服务器上新增的具体数据+ ------+------+|id|name|+------+------+|1|apex|+------+------+1rowinset(0.00sec) 本文转自 corasql 51CTO博客,原文链接:http://blog.51cto.com/corasql/1906986,如需转载请自行联系原作者