linux centos下mysql数据库的主从复制环境搭建

有两台MySQL数据库服务器Master和slave,Master为主服务器,slave为从服务器,初始状态时,Master和slave中的数据信息相同,当Master中的数据发生变化时,slave也跟着发生相应的变化,使得master和slave的数据信息同步,达到备份的目的。

原理图如下:

简单来说,mysql的主从复制的原理就是slave把master上面执行的 update,insert这些会使数据发生改变的sql语句从master上面同步过来,然后在自己的机器上再执行一遍,那么这两台数据库服务器上的数据就一模一样了,而那些要同步的sql语句就存在bin-log文件里面

我这里有两台机器分别是192.168.1.6(master) 192.168.1.5(slave)

我们先从master机器开始配置

修改/etc/my.cnf 文件(mysql启动默认是从/etc/my.cnf读取的,所以你别的地方有配置文件的话建议直接移到/etc目录下)

[client]
port = 3306
socket = /usr/local/mysql/mysql.sock

[mysqld]
character-set-server = utf8
collation-server = utf8_general_ci

skip-external-locking
skip-name-resolve

user = mysql
port = 3306
basedir = /usr/local/mysql
datadir = /home/mysql/data
tmpdir = /home/mysql/temp
# server_id = .....
socket = /usr/local/mysql/mysql.sock
log-error = /home/mysql/logs/mysql_error.log
pid-file = /home/mysql/mysql.pid

open_files_limit = 10240

back_log = 600
max_connections=500
max_connect_errors = 6000
wait_timeout=605800

#open_tables = 600
#table_cache = 650
#opened_tables = 630

max_allowed_packet = 32M

sort_buffer_size = 4M
join_buffer_size = 4M
thread_cache_size = 300
query_cache_type = 1
query_cache_size = 256M
query_cache_limit = 2M
query_cache_min_res_unit = 16k

tmp_table_size = 256M
max_heap_table_size = 256M

key_buffer_size = 256M
read_buffer_size = 1M
read_rnd_buffer_size = 16M
bulk_insert_buffer_size = 64M

lower_case_table_names=1

default-storage-engine = INNODB

innodb_buffer_pool_size = 2G
innodb_log_buffer_size = 32M
innodb_log_file_size = 128M
innodb_flush_method = O_DIRECT

#####################
thread_concurrency = 32
long_query_time= 2
slow-query-log = on
slow-query-log-file = /home/mysql/logs/mysql-slow.log  

## replication
server_id=6
binlog-ignore-db=mysql
log-bin=master-mysql-bin
binlog_cache_size=1M
binlog_format=mixed
expire_logs_days=7
slave_skip_errors=1062

[mysqldump]
quick
max_allowed_packet = 32M

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

这里主要的配置就是和复制相关的这段配置,其它配置是mysql源码安装时配置,里面具体参数代表什么意思可以网上搜一下,文档很多的

## replication
server_id=6
binlog-ignore-db=mysql
log-bin=master-mysql-bin
binlog_cache_size=1M
binlog_format=mixed
expire_logs_days=7
slave_skip_errors=1062

我简单解释一下,复制有关的参数

serverid 全局唯一的

binlog-ignore-db=mysql复制过滤,我们不同步mysql系统自带的数据库

log-bin=master-mysql-bin 开启logbin功能并设置logbin文件的名称

binlog_format=mixed 混合型复制模式,默认采用基于语句的复制,一旦发现基于语句的无法精确的复制时,就会采用基于行的复制。

接下来重启mysql服务并用客户端登录

slave想要同步master上的数据首先肯定需要权限,所以我们要在master上面开通权限

grant replication slave, replication client on *.* to 'root'@'192.168.1.5' identified by
'root';

账号和密码都是root ,允许192.168.1.5这台机器向master发送同步请求,当然你可以设成别的,我这里只是为了方便记忆,设了太多不同的密码容易忘记

刷新一下授权信息,然后查看当前master的状态

show master status,我这里解释一下,我们知道关于对数据库修改的sql全部记录在了bin-log里面,那么我们就每次都把bin-log里面的sql全部执行一遍?肯定不是,我们肯定要记录我上次复制到哪儿里了,然后我下次再从这个点开始同步,就像我们玩单机游戏闯了3关以后要存下档一样,下次玩我们继续从第三关开始玩,这是一个意思。

接下来我们随便写点测试数据到数据库里面去

create database if not exists pcx default charset utf8 collate utf8_general_ci;
use pcx;
DROP TABLE IF EXISTS `fruits`;
CREATE TABLE fruits
(
f_id    char(10)     	NOT NULL,
s_id    INT        	NOT NULL,
f_name  char(255)  	NOT NULL,
f_price decimal(8,2)  	NOT NULL,
PRIMARY KEY(f_id)
)ENGINE=InnoDB DEFAULT CHARSET=utf8 ;

INSERT INTO fruits (f_id, s_id, f_name, f_price)
     VALUES('a1', 101,'apple',5.2),
     ('b1',101,'blackberry', 10.2),
     ('bs1',102,'orange', 11.2),
     ('bs2',105,'melon',8.2),
     ('t1',102,'banana', 10.3),
     ('t2',102,'grape', 5.3),
     ('o2',103,'coconut', 9.2),
     ('c0',101,'cherry', 3.2),
     ('a2',103, 'apricot',2.2),
     ('l2',104,'lemon', 6.4),
     ('b2',104,'berry', 7.6),
     ('m1',106,'mango', 15.6),
     ('m2',105,'xbabay', 2.6),
     ('t4',107,'xbababa', 3.6),
     ('m3',105,'xxtt', 11.6),
     ('b5',107,'xxxx', 3.6);

接下来我们把pcx这个库下的数据全部备份下来

首先我们要锁表

flush tables with read lock;

接下来用mysql的备份命令进行备份

最后我们把edu-master.sql发送到slave的机器上面

好了,我们接下来开始配置slave(192.168.1.5)

同样打开my.cnf文件开始配置

vi /etc/my.cnf
[client]
port = 3306
socket = /usr/local/mysql/mysql.sock

[mysqld]
character-set-server = utf8
collation-server = utf8_general_ci

skip-external-locking
skip-name-resolve

user = mysql
port = 3306
basedir = /usr/local/mysql
datadir = /home/mysql/data
tmpdir = /home/mysql/temp
# server_id = .....
socket = /usr/local/mysql/mysql.sock
log-error = /home/mysql/logs/mysql_error.log
pid-file = /home/mysql/mysql.pid

open_files_limit = 10240

back_log = 600
max_connections=500
max_connect_errors = 6000
wait_timeout=605800

#open_tables = 600
#table_cache = 650
#opened_tables = 630

max_allowed_packet = 32M

sort_buffer_size = 4M
join_buffer_size = 4M
thread_cache_size = 300
query_cache_type = 1
query_cache_size = 256M
query_cache_limit = 2M
query_cache_min_res_unit = 16k

tmp_table_size = 256M
max_heap_table_size = 256M

key_buffer_size = 256M
read_buffer_size = 1M
read_rnd_buffer_size = 16M
bulk_insert_buffer_size = 64M

lower_case_table_names=1

default-storage-engine = INNODB

innodb_buffer_pool_size = 2G
innodb_log_buffer_size = 32M
innodb_log_file_size = 128M
innodb_flush_method = O_DIRECT

#####################
thread_concurrency = 32
long_query_time= 2
slow-query-log = on
slow-query-log-file = /home/mysql/logs/mysql-slow.log  

## replication
server_id=5
binlog-ignore-db=mysql
log-bin=mysql-slave-bin
binlog_cache_size = 1M
binlog_format=mixed
expire_logs_days=7
slave_skip_errors=1062
relay_log=mysql-relay-bin
log_slave_updates=1
read_only=1

[mysqldump]
quick
max_allowed_packet = 32M

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

配置文件和master的差不多,主要差别在一下几点

log-bin=mysql-slave-bin开启了二进制日志,实际上不开也没关系,因为我们这个slave只是做slave,如果你这台slave还有可能要做别人的master的话那么必须开启

relay_log=mysql-relay-bin配置中继日志,用来存放从master的bin-log那边同步来的数据

配置好后重启数据库服务

service mysql restart

我们首先要创建一下数据库,因为我们备份下来的数据库文件里面是不包含创建数据库的命令的,所以我们要手动创建一下

把我们从master那边备份过来的数据恢复到slave中

登录 Slave 数据库

在mysql客户端中输入一下命令连接master

change
 master  to  ,

master_host=‘192.168.1.6‘
master主机的ip地址

master_user=‘root‘,

master_password=‘root‘,
我们刚刚在master有执行过授权的账号密码就是这个

master_port=3306,master数据库的端口号

master_log_file=‘edu-mysql-bin.000002‘,

master_log_pos=427,
这个是我们通过show master status看到的position

master_connect_retry=30;

使用命令查看slave状态,我们可以看到slave目前还未开始同步

 show slave status\G;

开始主从同步,主要看到两个yes就代表同步成功了

start slave;

在master机器上查看状态,可以看见slave的连接信息

show processlist\G;

接下来我们测试一下主从复制的功能

master 上原来的数据

这是我插入的记录

我们到slave上面看看有没有,有就代表成功了

至此mysql原生支持的主从复制搭建完毕,当然我们说mysql的主从复制

性能上回有延迟,master上的数据不是无延迟的同步到slave上面,所以如果你对数据的一致性要求非常高的话,那么mysql官方的主从复制就不合适了,可以考虑用别的数据同步方案例如“Galera Cluster
for MySQL” ,当然也有人说mysql官方支持的主从复制只是适合在中小规模的集群下运行。

时间: 2024-10-06 08:36:07

linux centos下mysql数据库的主从复制环境搭建的相关文章

centos下mysql 数据库安装、调试

博主是一个linux的初学者,决定记录学习过程中的点滴,当做一个成长记录也好,当做后来人学习的参考也罢,总之,博客就在那里,我们各取所需,只是不要让他孤独就好. 首先,持久化数据是一个程序必备的模块,恰逢博主的项目中也需要在centos操作系统上部署,所以就以安装mysql数据库开始吧.可能你觉得内容比较简单,但无所谓吧,会者谓之简单:不会者谓之难.博主只求用最简单的描述,满足“不会者”的好学. 主要分为两种方式,一种是下载安装包,然后安装:一种是通过yum命令.博主觉得通过yum命令比较简单,

CentOS下MySQL数据库安装

前辈们总是说,要边学边记录,要总结.所以,开始把每天学到的内容一点一点记录. 复杂的理论不懂,只会目前安装,安好后就开始玩咯! 1.在官网下载相应的rpm安装包 下载地址:http://dev.mysql.com/downloads/mysql/5.6.html#downloads 比如:我只下载了这三个. 2.鄙人就用rpm命令安装(相对较熟悉) 其实,这是应该是第3步 #rpm -ivh MySQL-client-5.6.19-1.el6.i686.rpm #rpm -ivh MySQL-d

解决Linux系统下Mysql数据库中文显示成问号的问题

当我们将开发好的javaWEB项目部署到linux系统上,操作数据库的时候,会出现中文乱码问题,比如做插入操作,发现添加到数据库的数据中文出现论码,下面就将解决linux下mysql中文乱码问题! 打开Linux窗口,启动mysql. 连接mysql输入show variables like '%char%'; 出现如下图,这样的话在linux下操作mysql会出现中文乱码,所以我们要解决这个问题. 关闭mysql,找到 /etc/my.cnf 文件 3.1 如果没有找到my.cnf文件,就从

CentOS下MYSQL数据库的安装

关于在Centos系统下安装MYSQL数据库,网络上资料有很多,在此主要感谢该文章的博主:http://www.cnblogs.com/zhoulf/archive/2013/01/25/zhoulf.html,因为相对来说,该篇文章具有很强的操作性.此文将在汇集众多资料的基础上,记录本人安装MYSQL的全过程. 一.配置环境与软件版本: 1.Centos版本:6.3版32位系统: 2.CMake版本:cmake-2.8.4.tar.gz: 3.Mysql版本:mysql-5.5.11.tar.

Linux(centos)下mysql编译安装教程

Linux下mysql编译安装教程 #查看linux发行版本号 cat /etc/issue #查看linux内核版本 uname -r 本文测试环境centOS6.6 一.Linux下编译安装MySQL前的准备工作 在线安装编译源码所需的工具和库(无法联网的话要事先准备软件,或者系统盘) yum install gcc gcc-c++ ncurses-devel perl 从mysql5.5起源代码编译需要借助cmake这款编译工具.从http://www.cmake.org下载cmake源码

Centos下mysql数据库备份与恢复的方法

一.mysqldump工具备份 mysqldump由于是mysql自带的备份工具,所以也是最常用的mysql数据库的备份工具.支持基于InnoDB的热备份.但由于是逻辑备份,所以速度不是很快,适合备份数据量比较小的场景. mysqldump完全备份+二进制日志 ->实现时间点恢复 温备: 在使用MyISAM引擎中,只能使用温备份,这时候要防止数据的写入,所以先加上读锁 这时候可以进入数据库手动加读锁.这样比较麻烦,在mysqldump工具中直接有一个加锁的选项 mysqldump --datab

CentOS下mysql数据库常用命令总结

mysql数据库使用总结 本文主要记录一些mysql日常使用的命令,供以后查询. 1.更改root密码 mysqladmin -uroot password 'yourpassword' 2.远程登陆mysql服务器 mysql -uroot -p -h192.168.137.10 -P3306 3.查询数据库 show databases; 4.进入某个数据库 use databasename; 5.列出数据库中的表 show tables; 6.查看某个表全部字段 desc slow_log

CentOS下mysql数据库data目录迁移

公司新上线一个资讯网站,独立主机,raid5,lamp架构.由于资讯网是面向小行业,初步估计一两年内访问量压力不大,故,在做服务器系统搭建的时候,只是简单分出一个独立的data区作为数据库和网站程序的专区,其他按照linux的默认分区.apache,mysql,php均使用yum安装(也尝试过独立编译安装,但现实使用中,发现不如yum方便快捷,当然如果是大型应用型网站,估计就不是简单的yum了) 由于yum安装mysql的时候,数据库的data目录默认是在/var/lib下,出于数据安全性的考虑

CentOS下mysql数据库data目录迁移和配置优化

目录迁移 关闭数据库服务 service mysqld stop 复制数据库 mv /var/lib/mysql /data/mysql # 或者使用cp -a复制 # 这两个命令都会带权限到新目录去 修改配置文件 /etc/my.cnf [mysqld] #datadir=/var/lib/mysql ------原系统默认路径 datadir=/data/mysql ------现有路径 #socket=/var/lib/mysql/mysql.sock ------原socket路径现 s