mysql 同步整个哭_系统变迁之四--mysql主从同步-Go语言中文社区

主从同步

第一篇文章说过,初始版本的系统一直单库运行,所有的读、写,以及数据存储都放在了同一台dbserver中。出现问题,哭都没地方...于是...增加多个dbserver,单主库多从库,避免出现单库数据文件问题导致的数据损失...

修改数据文件的存储位置

mysql默认的数据库文件是放在安装目录下的(/var/lib/mysql),先把这个路径设定到阿里云数据盘,防止系统更新或者其他问题时造成数据文件损坏。

使用root用户或具有root权限的用户,在目标路径下新建一个目录,比如叫做mysqldata,并修改其权限

mkdir /alidata1/mysqldata

chown -R mysql:mysql /alidata1/mysqldata/  ← 改变数据库的归属为mysql

把MySQL服务进程停掉(一开始就做了,或者半夜干吧...):

mysqladmin -u root -p shutdown

把/var/lib/mysql整个目录移到/alidata1/mysqldata

mv /var/lib/mysql /alidata1/mysqldata

找到my.cnf配置文件,如果/etc/目录下没有my.cnf配置文件,请到/usr/share/mysql/下找到*.cnf文件,拷贝其中一个到/etc/并改名为my.cnf)中。命令如下:

cp /usr/share/mysql/my-medium.cnf /etc/my.cnf

编辑MySQL的配置文件/etc/my.cnf,为保证MySQL能够正常工作,需要指明mysql.sock文件的产生位置。修改socket=/var/lib/mysql/mysql.sock一行中等号右边的值为:/alidata1/mysqldata/mysql.sock 。操作如下:

vi  my.cnf  (用vi工具编辑my.cnf文件,找到下列数据修改之)

# The MySQL server[mysqld]  port = 3306

#socket  = /var/lib/mysql/mysql.sock(原内容,为了更稳妥用“#”注释此行)

socket  = /alidata1/mysqldata/mysql.sock (加上此行)

// 为了防止binlog日志挤爆硬盘,加入另外的配置:

expire_logs_days = 10 (表示binlog日志过期时间,单位为天,注意这个配置是在每次切换新的log文件时才会清除对应的log文件的。也可以在mysql运行期间命令行执行 set global expire_log_days=10)

修改MySQL启动脚本/etc/init.d/mysql,把其中datadir=/var/lib/mysql一行中,等号右边的路径改成你现在的实际存放路径:/alidata1/mysqldata

vi /etc/init.d/mysql

#datadir=/var/lib/mysql(注释此行)

datadir=/alidata1/mysqldata (加上此行)

如果是CentOS还要改 /usr/bin/mysqld_safe 相关文件位置;最后 做一个mysql.sock 链接:

ln -s /home/data/mysql/mysql.sock /var/lib/mysql/mysql.sock

重新启动MySQL服务

/etc/init.d/mysqld start

主库设置成功后,其他的从库也全都按照同样的步骤来操作。

导出及导入数据

在主库服务器中执行以下命令,用于导出对应的数据库

mysqldump -u mysqlsuperuser -p dbname> dbname.sql

在从库中先建立同名数据库

mysql -u mysqlsuperuser -p

create database dbname

使用scp或者别的命令将dbname.sql拷贝到对应的从库服务器(们),并导入:

mysql -u mysqlsuperuser -p

source /path/dbname.sql

在主从库中创建用于同步的数据库用户

创建用户

create user 'dbcopy'@'%' identified by '****'

赋相应的权限

主库

grant replication slave,replication client on . to 'dbcopy'@'%' identified by '****';

从库

grant replication slave,replication client on . to 'dbcopy'@'%' identified by '****';

......

配置同步选项

修改主库的my.cnf文件

log_bin = mysql-bin

server_id = 21013 (必须明确地指定一个唯一的服务器ID 此处取服务器Ip的最后两个段).

如果之前没有在mysql 的配置文件中指定log_bin 就需要重新启动Mysql。 为了确认二进制日志文件是否已经在主库上创建,使用以下命令查看

show master status;

修改各从库的my.cnf文件

备库上也需要做同样的配置,并重启数据库

log_bin = mysql-bin

server_id = 208246

relay_log = /var/lib/mysql/mysql-relay-bin (指定中继日志的位置和命名)

log_slave_updates = 1 (允许备库将其重放的事件也记录到自身的二进制日志)

read_only = 1(只读模式,防止多端同时写数据造成各个点的数据不同步)

开启复制

在从库中执行以下命令

CHANGE MASTER TO MASTER_HOST='masterIP',

MASTER_USER='dbcopy',

MASTER_PASSWORD='****',

MASTER_LOG_FILE = 'mysql-bin.000002',

MASTER_LOG_POS=0;

其中master_log_file和master_log_pos的值都是在主库中使用show master status来取到的。刚开始配置时,pos位置可以指定为0

常用命令

SHOW SLAVE STATUS; //查看配置信息。

START SLAVE;//开启复制。

STOP SLAVE; //停止复制

其他配置

推荐的复制配置

在主库上二进制日志最重要的选项是:

sync_binlog =1

如果开启该选项,mysql每次在提交事物请会将二进制日志同步到磁盘上,保证在服务器崩溃的时候不会丢失事件。

如果使用InnoDB 强烈推荐设置如下选项:

innodb_flush_logs_at_trx_commit

innodb_support_xa=1

innodb_safe_binlog

如果正在使用mysql 5.5 ,最好设置以下选项:

sync_master_info=1

sync_replay_log = 1

sync_relay_long_info =1

出现数据不同步时的处理方案

当出现数据不同步时,一般执行 show slave status;会有以下结果:

25d814be993fc9ac68e36e3a39d537a9.png

Paste_Image.png

Slave_IO_Running:连接到主库,并读取主库的日志到本地,生成本地日志文件

Slave_SQL_Running:读取本地日志文件,并执行日志里的SQL命令。

一般是出现同步错误或者master_log的info出现了变化,相应的解决方案如下:

同步错误解决方案:

slave stop;

set GLOBAL SQL_SLAVE_SKIP_COUNTER=1; //值为1表示跳过一个错误,可以设置为N。不过跳过去的数据就跟主库不同步了,要手动处理

slave start;

show slave status; // 查看同步状态是否恢复正常了

主库日志信息变更导致的错误解决方案

查看主库

show master status; //记录下File,Position字段,假设为‘mysql-bin.000004’,98;

在从库中执行以下命令:

stop slave;

change master to master_log_file='mysql-bin.000004',master_log_pos=98;

start slave;

show slave status; //查看同步状态

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值