单服务器MySQL主从复制实践

一、先配置好两个MySQL实例并可以正常启动

1. 首先在Linux上先安装好MySQL数据库,此处省略详细的安装步骤(可以使用yum安装)

yum -y install mysqld mysql

2. 在/usr/local目录下新建目录mysqls/mysql1, mysqls/mysql2 分别作为我们的主数据和从数据库目录,新建mysqls/run作为MySQL PID存放目录,新建mysqls/log作为MySQL日志目录

mkdir -p /usr/local/mysqls/mysql1 /usr/local/mysqls/mysql2
mkdir -p /usr/local/mysqls/run /usr/local/mysqls/log

3. 复制MySQL默认的配置文件/etc/my.cnf到/usr/local/mysqls下,并复制两份分别命名为mysql1.cnf和mysql2.cnf。这两个文件将作为主从MySQL数据库的配置文件(使用这种方式,可以不影响原有MySQL配置,默认MySQL仍可正常使用)

cp /etc/my.cnf /usr/local/mysqls/mysql1.cnf
chown -R mysql:mysql
cd /usr/local/mysqls
cp mysql1.cnf mysql2.cnf

4. 修改MySQL实例配置文件,指定datadir, socket, port, log-error, pid-file的路径:

mysql1.cnf 配置如下:

[mysqld]
datadir=/usr/local/mysqls/mysql1
socket=/usr/local/mysqls/mysql1/mysql.sock
port=33061
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
#default-character-set=utf8
character-set-server=utf8 
[mysqld_safe]
log-error=/usr/local/mysqls/log/mysql1.log
pid-file=/usr/local/mysqls/run/mysql1.pid
[client]
default-character-set=utf8
socket=/usr/local/mysqls/mysql1/mysql.sock

mysql2.cnf 参考上面配置,使用mysql2目录,端口号设置为33062

5. 接下来使用mysql_install_db脚本初始化这两个MySQL数据库实例(该脚本会在mysql1和mysql2目录下自动安装MySQL基本数据库 : mysql)

/usr/bin/mysql_install_db --defaults-file=/usr/local/mysqls/mysql1.cnf
/usr/bin/mysql_install_db --defaults-file=/usr/local/mysqls/mysql2.cnf

6. 为了每次方便启动实例,我们可以编写如下启动脚本,脚本中使用mysqld_safe启动MySQL实例:

start_mysql1.sh 内容如下:

#/bin/bash
no=1
exe=/usr/bin/mysqld_safe
madmin=/usr/bin/mysqladmin
base=/usr/local/mysqls
sub=mysql$no
conf=$base/$sub.cnf
socket=$base/$sub/mysql.sock
pidfile=$base/run/$sub.pid
port=3306$no
timeout=60
 
$exe --defaults-file=$conf 2>&1 &
while [ $timeout -gt 0 ]; do
        $madmin --socket="$socket" --user=root --port=$port ping >/dev/nul 2>&1
        mret=$?
        if [ $mret -eq 0 ]; then
                now=`date +‘%Y-%m-%d %H:%M:%S‘`
                echo "[$now] Start $sub : OK"
                echo "[$now] PID : `cat $pidfile`"
                netstat -atulnp | grep $port
                break
        fi
        sleep 1
        let timeout=${timeout}-1
done

start_mysql1.sh 用于启动mysql1,同样我们可以类似编写start_mysql2.sh用于启动mysql2(修改no变量的值为2即可)

注:shell 脚本文件在执行前需要设置可执行权限(类似这样:chown u+x start_mysql1.sh)

7. 至此,MySQL两个实例的准备工作就做好了,我们可以尝试启动它们了(以mysql1为例)

/usr/local/mysqls/start_mysql1.sh

如果一切顺利,将出现以下结果:

二、 接下来,我们开始设置主从复制

1. 停止MySQL实例,为了方便同样编写停止脚本

stop_mysql.sh内容如下:

#/bin/bash
 
if [ $# -ne 1 ]; then
        echo "Usage : $0 <mysql no>"
        exit -1
fi
 
no=$1
sub=mysql$no
base=/usr/local/mysqls
pidfile=$base/run/$sub.pid
 
if [ ! -f "$pidfile" ]; then
        echo "‘$pidfile‘ not exist, mysql server may not start"
        exit -2
fi
pid=`cat $pidfile`
kill $pid

执行:stop_mysql.sh 1 即可停止mysql1, 后面参数改为2即可停止mysql2,就像下面这样:

2. 配置主数据库,开启复制功能(这里使用mysql1作为主数据库,mysql2作为从数据库)

mysql1.cnf中[mysqld]标记下面增加如下配置:

[mysqld]
...
#replication
log-bin=/usr/local/mysqls/log/mysql1-bin.log    # 这是MySQL bin log的位置
server-id=1    # server id, 标识mysql
# 下面两个参数表示确保InnoDB事务数据库可以保持最大的持久性和一致性
innodb_flush_log_at_trx_commit=1
sync_binlog=1
# 额外的参数,我们可以设置置复制哪个库、哪个表,不复制哪个库、哪个表(这里不详述,具体参考MySQL官方文档)
# 例如:
# replicate-do-db=mydb
# replicate-do-table=mytable
# replicate-ignore-db=mysql
# replicate-ignore-table=user

3. 启动mysql1,mysql命令连接并添加复制账户,同时查看master状态

start_mysql1.sh
mysql -S /usr/local/msyqls/mysql1.sock -uroot -p
mysql> grant all on *.* to ‘rep‘@‘localhost‘ identified by ‘replpass‘; # 实际环境中这里根据自己需求而定
mysql> flush privileges;
mysql> show master status \G
*************************** 1. row ***************************
           File: mysql1-bin.000002
       Position: 1486
   Binlog_Do_DB: 
Binlog_Ignore_DB: 
1 row in set (0.00 sec)

4. 如果主从数据库是全新搭建的(没有实际数据)可以不用备份主库到从库,否则需要导出主库数据到从库

# 设置读锁(禁止写入)
mysql> flush tables with read lock; 
# 执行备份操作
/usr/bin/mysqldump -uroot -p --database mydb1, mydb2 ... > dump.sql
#解锁

mysql> unlock tables;

?

5. 配置从数据库复制参数

mysql2.cnf中mysqld标记下增加如下配置:

#replication
log-bin=/usr/local/mysqls/log/mysql2-bin.log
server-id=2
master-host=localhost    # 主库地址
master-port=33061        # 主库端口号
master-user=rep          # 上面所设置的复制账户
master-pass=somepass     # 复制账户密码

master-connect-retry=60  # 重试连接的间隔时间

6. 启动从数据库,若主库有数据需要导入则先导入刚才的备份,接着设置复制起始位置,启动slave

start_mysql2.sh
mysql -S /usr/local/mysqls/mysql2/mysql.sock -uroot -p < dump.sql 
mysql -S /usr/local/mysqls/mysql2/mysql.sock -uroot -p
mysql> change master to
   -> master_log_file=mysql1-bin.000002
   -> master_log_pos=1486;
mysql> start slave;
mysql> show slave status \G
*************************** 1. row ***************************
              Slave_IO_State: Waiting for master to send event
                 Master_Host: localhost
                 Master_User: rep
                 Master_Port: 33061
               Connect_Retry: 60
             Master_Log_File: mysql1-bin.000002
         Read_Master_Log_Pos: 1486
              Relay_Log_File: mysql2-relay-bin.000002
               Relay_Log_Pos: 252
       Relay_Master_Log_File: mysql1-bin.000002
            Slave_IO_Running: Yes
           Slave_SQL_Running: Yes
             Replicate_Do_DB: 
         Replicate_Ignore_DB: 
          Replicate_Do_Table: 
      Replicate_Ignore_Table: 
     Replicate_Wild_Do_Table: 
 Replicate_Wild_Ignore_Table: 
                  Last_Errno: 0
                  Last_Error: 
                Skip_Counter: 0
         Exec_Master_Log_Pos: 106
             Relay_Log_Space: 554
             Until_Condition: None
              Until_Log_File: 
               Until_Log_Pos: 0
          Master_SSL_Allowed: No
          Master_SSL_CA_File: 
          Master_SSL_CA_Path: 
             Master_SSL_Cert: 
           Master_SSL_Cipher: 
              Master_SSL_Key: 
       Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
               Last_IO_Errno: 0
               Last_IO_Error: 
              Last_SQL_Errno: 0
              Last_SQL_Error: 
1 row in set (0.00 sec)

7. OK , MySQL两实例主从复制就搭建好了。

注:文中使用mysql命令时指定socket文件是必须的,亦可以类似写相应的脚本以免每次连接都需加这个参数

mysql1.sh 内容如下:

#/bin/bash
no=1
base=/usr/local/mysqls/
sub=mysql$no
socket=$base/$sub/mysql.sock
mysql -S $socket $*

mysql2.sh 则修改no的值为2

时间: 2024-11-07 16:35:03

单服务器MySQL主从复制实践的相关文章

mysql主从复制实践之单数据库多实例

1.主从复制数据库实战环境准备 MySQL主从复制实践对环境的要求比较简单,可以是单机单数据库多实例的环境,也可以是两台服务器之间,每台服务器都部署一个独立的数据库的环境.本文以单机数据库多实例的环境进行实践. 2.主从复制服务器角色定义 序号 数据库角色 数据库IP信息 数据库port信息 数据库配置路径 1 master 192.168.1.20 3306 /data/3306 2 slave1 192.168.1.20 3307 /data/3307 3 slave2 192.168.1.

MySQL主从复制实践与部署

本文主要介绍在单机单数据库多实例的环境下,实现MySQL主从复制功能 基本流程: 1.MySQL主从复制介绍 2.主从复制数据库实战环境准备 3.在主库Master上执行操作配置 4.在MySQL从库上执行的操作过程 5.启动从库同步开关,测试主动复制配置情况 6.MySQL主从复制配置步骤总结 流程一:MySQL主从复制介绍 Mysql数据库的主从复制方案,与使用scp/rsync等命令进行的文件级别复制类似,都是数据的远程传输,只不过Mysql的主从复制是其自带的功能,无需借助第三方工具,而

mysql 主从复制 实践

异步主从复制   主从部署步骤: 备份还原 使用mysqldump或者xtrabackup 把主库现有基础数据还原到从库 授权 grant replication slave on *.* 给从库一个复制binlog的账号 配置复制,并启动 从库上配置复制信息,并指向master 查看主从复制信息 show slave status \G 1)备份还原 主:101 从:100 a)主库备份 [email protected]untu:~$ mysqldump -uroot -p --socket

CentOS服务器Mysql主从复制集群的搭建

环境:CentOS6.3 数据库mysql6.5.26 编辑/etc/my.cnf vi /etc/my.cnf 重启mysql service mysqld restart create user 'mastj'@'192.168.1.16' identified by '123456'; grant replication slave on *.* to 'mastj'@'118.123.199.12' identified by '123456'; show master status;

MySQL主从复制介绍

1.1 MySQL主从复制原理介绍 MySQL的主从复制是一个异步的复制过程(虽然一般情况下感觉是实时的),数据将从一个MySQL数据库(我们称之为Master)复制到另一个MySQL数据库(我们称之为Slave),在Master与Slave之间实现整个主从复制的过程是由三个线程参与完成的,其中有两个线程(SQL线程和IO线程)在Slave端,另外一个线程(I/O线程)在Master端. 要实现MySQL的主从复制,首先必须打开Master端的binlog记录功能,否则就无法实现.因为整个复制过

MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践 转载

http://heylinux.com/archives/1004.html MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践 Mysql作为目前世界上使用最广泛的免费数据库,相信所有从事系统运维的工程师都一定接触过.但在实际的生产环境中,由单台Mysql作为独立的数据库是完全不能满足实际需求的,无论是在安全性,高可用性以及高并发等各个方面. 因此,一般来说都是通过 主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-Proxy

重新学习Mysql数据13:Mysql主从复制,读写分离,分表分库策略与实践

一.MySQL扩展具体的实现方式 随着业务规模的不断扩大,需要选择合适的方案去应对数据规模的增长,以应对逐渐增长的访问压力和数据量. 关于数据库的扩展主要包括:业务拆分.主从复制.读写分离.数据库分库与分表等.这篇文章主要讲述数据库分库与分表 (1)业务拆分 在?大型网站应用之海量数据和高并发解决方案总结一二?一篇文章中也具体讲述了为什么要对业务进行拆分. 业务起步初始,为了加快应用上线和快速迭代,很多应用都采用集中式的架构.随着业务系统的扩大,系统变得越来越复杂,越来越难以维护,开发效率变得越

【大型网站技术实践】初级篇:搭建MySQL主从复制经典架构 一、业务发展驱动数据发展

一.业务发展驱动数据发展 随着网站业务的不断发展,用户量的不断增加,数据量成倍地增长,数据库的访问量也呈线性地增长.特别是在用户访问高峰期间,并发访问量突然增大,数据库的负载压力也会增大,如果架构方案不够健壮,那么数据库服务器很有可能在高并发访问负载压力下宕机,造成数据访问服务的失效,从而导致网站的业务中断,给公司和用户造成双重损失.那么,有木有一种方案能够解决此问题,使得数据库不再因为负载压力过高而成为网站的瓶颈呢?答案肯定是有的. 目前,大部分的主流关系型数据库都提供了主从热备功能,通过配置

MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践

Mysql作为目前世界上使用最广泛的免费数据库,相信所有从事系统运维的工程师都一定接触过.但在实际的生产环境中,由单台Mysql作为独立的数据库是完全不能满足实际需求的,无论是在安全性,高可用性以及高并发等各个方面. 因此,一般来说都是通过 主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-Proxy)来提升数据库的并发负载能力 这样的方案来进行部署与实施的. 如下图所示: 下面是我在实际工作过程中所整理的笔记,在此分享出来,以供大家参考. 一.MySQL的安装与