Centos6.3下mysql主从复制笔记

简介:

MySQL主从复制结构是基于mysql bin-log日志基础上从库通过打开IO进程收到主库的bin-log日志增量信息,并保存到本地relay log,而后再通过打开MYSQL进程从relay log上获取的增量信息并翻译成SQL语句后写到从数据库。

主从复制结构实际上可以实现两个功能

1.从库充当主库的数据库备份实例

2.读写分离主库负责正常读写数据从库只负责读数据

实际生产环境因为很多应用实际读数据库的次数远大于写数据库的次数所以在项目开发初期编写程序时做一个判断对所有读的操作全部推到从库若从库无法获取数据则再向主库获取数据从而在一定意义上实现读写分离缓解主库的IO压力。

所以生产环境下推荐使用这种架构。


系统环境centos6.3 x64

数据库 mysql-5.6.10


mysql master:192.168.100.90

mysql slave:192.168.100.91


091218484.jpg


一.部署环境


1.关闭iptables和SELINUX

# service iptables stop

# setenforce 0

# vi /etc/sysconfig/selinux

---------------

SELINUX=disabled

---------------


2.安装配置mysql传送门http://showerlee.blog.51cto.com/2047005/1174141


二.主mysql配置:(mysql master)


修改mysql配置文件

# vi /etc/my.cnf

添加

-----------------

# Replication Master Server

# bin日志路径

log-bin = /usr/local/mysql/log/bin.log

# 服务器ID号

server-id = 1

# 忽略mysql系统库复制

binlog-ignore-db=mysql

binlog-ignore-db=information_schema

------------

重启服务

# service mysqld restart


登录mysql后台

# mysql -u root -p123456

查看此刻登录账号

> select user();


在master为slave添加同步帐号

> grant replication slave on *.* to 'slave'@'192.168.100.91' identified by '123456';


查看创建的用户

> select user.host from mysql.user;


查看权限

> show grants for 'slave'@'192.168.100.91';


mysql锁表只读(其他账户登录mysql后无法进行写表操作防止备份数据库后主mysql表更新导致和从数据库内容不一致)

> flush tables with read lock;


查看锁表倒计时时间

> show variables like '%timeout%';

------------------------

....


wait_timeout  | 28800

------------------------


将master的数据库表全部备份导出并传送到slave服务器上。


# /usr/local/mysql/bin/mysqldump -u root -p123456 --opt --flush-logs --all-database > /root/allbak.sql

# cd ~

# scp allbak.sql root@192.168.100.91:/root


查看mysql偏移量(数据库如果有写操作偏移值会递增)

# mysql -u root -p123456 -e "show master status"

----------------------

+------------+----------+--------------+------------------+-------------------+

| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

+------------+----------+--------------+------------------+-------------------+

| bin.000009 | 120 |  |   |   |

+------------+----------+--------------+------------------+-------------------+

----------------------

保证FILE列和Position列与从库配置一致



三.从mysql配置mysql slave


修改mysql配置文件

# vi /etc/my.cnf

添加

--------------------

# Replication Slave Server

# bin日志路径无需开bin-log日志

#log-bin = /usr/local/mysql/log/bin.log

server-id=2

# 只读

read-only

# 忽略mysql系统库复制

binlog-ignore-db=mysql

binlog-ignore-db=information_schema

---------------------


重启服务

# service mysqld restart


恢复server的数据库到slave

#/usr/local/mysql/bin/mysql -u root -p123456 < /root/allbak.sql


配置连接同步到server端

# mysql -u root -p123456;

> stop slave;

> reset slave;

> change master to master_host='192.168.100.90',master_user='slave',master_password='123456',master_log_file="bin.000009",master_log_pos= 120 ;

> start slave;

注master_log_file表示从主数据库哪个bin-log文件开始同步  

master_log_pos表示从该bin-log文件哪条记录点开始同步

需与主库偏移值保持同步


回到主mysql数据库解锁mysql master

# mysql -u root -p123456

> unlock tables;


最后登陆从mysql后台查看主从连接状态

# mysql -u root -p123456 -e "show slave status\G;"

找到这五行如下则主从配置成功

------------------------

Slave_IO_State: Waiting for master to send event

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

Read_Master_Log_Pos: 120

Relay_Master_Log_File: bin.000009

-------------------------


四.测试主从是否同步

(server)

# mysql -u root -p123456 -e "create database test02;"

# mysql -u root -p123456 -e "show databases like 'test02';"

------------

+-------------------+

| Database (test02) |

+-------------------+

| test02  |

+-------------------+

------------

(cilent)

# mysql -u root -p123456 -e "show databases like 'test02';"

-------------

+-------------------+

| Database (test02) |

+-------------------+

| test02  |

+-------------------+

-------------

测试成功。。


当server端的数据库数据发生变化时client端会同步更新从而实现主库备份和读写分离作用。

这里注意几点

1.mysql从库中需在my.cnf配置文件中加入 read-only参数保证从库只读。

# echo "read-only" >> /etc/my.cnf


2.忽略从库mysql与information_schema系统表同步

# echo "binlog-ignore-db=mysql" >> /etc/my.cnf

# echo "binlog-ignore-db=information_schema" >> /etc/my.cnf


生产环境主库用户的授权,授权增删改查权限。

> GRANT SELECT,INSERT,UPDATE,DELETE ON *.* to 'user'@'%' identified by '123456';


生产环境从库的授权,仅授权查权限。

> GRANT SELECT ON *.* to 'user'@'%' identified by '123456';


3.从库默认不开启bin-log日志功能除非做下级从库级联同步才需开启从库的bin-log日志。


4.主库由于硬件故障如何将从库提升为主库(一主多从)

(mysql slave)

(1) 确保从机没有再同步的SQL语句即出现Has read all relay log再关闭从库IO_Threat进程

# mysql -uroot -p123456

> stop slave IO_THREAD

(2) 关闭从库slave服务然后将其提升为主库

> stop slave

> reset master

(3) 更换从库IP为故障主库IP(配置方法略)

(4) 删除新的主库master.info和relay-log.info,防止下次重启还会按照从库启动

# cd /usr/local/mysql/log

# rm -rf master.info relay-log.info

(5) 重新配置从库连接主库的账号同步信息以及在下级从库重新设置偏移量保持与新的主库一致即可。

最后待主库硬件恢复将其再设置为从库并更换为上述从库IP地址,完成主从切换。


五.配置脚本

1.如果想实现无人值守备份主数据库可添加如下脚本并在凌晨执行定时任务

# vi /etc/rc.d/mysql_bak.sh

---------------------

#!/bin/sh


MYSQL_USER=root

MYSQL_PW="123456"


LOG_PATH=/usr/local/mysql/log

DATA_PATH=/usr/local/mysql/data

LOG_FILE=${LOG_PATH}/mysqllog_`date +%F`.log

DATA_FILE=${DATA_PATH}/mysql_backup_`date +%F`.sql.gz


BIN_PATH=/usr/local/mysql/bin

MYSQL_CMD="$BIN_PATH/mysql -u$MYSQL_USER -p$MYSQL_PW"

MYSQL_DUMP="$BIN_PATH/mysqldump -u$MYSQL_USER -p$MYSQL_PW --opt --flush-logs --all-database"


$MYSQL_CMD -e "flush tables with read lock;"

echo "-------show master status result-------" >> $LOG_FILE

$MYSQL_CMD -e "show master status" >> $LOG_FILE

${MYSQL_DUMP}|gzip > $DATA_FILE

$MYSQL_CMD -e "unlock tables"

mail -s "mysql slave log" 1234567@qq.com < $LOG_FILE

---------------------

凌晨3:30执行备份数据库操作

# crontab -e

---------------------

30 3 * * * /bin/sh /etc/rc.d/mysql_bak.sh > /dev/mull 2>&1

---------------------

# service crond restart


2.如果想实现将主库备份的数据分发到从库恢复从库数据库以及开启从库功能可添加如下脚本

注这里建议主从先做好秘钥认证

详见传送门http://showerlee.blog.51cto.com/2047005/1217651

# vi /etc/rc.d/mysql_bak1.sh

------------------

#!/bin/sh


MYSQL_USER=root

MYSQL_PW="123456"


MYSQL_SLAVE_IP="192.168.100.91"

SSH_PATH="/usr/bin/ssh"

SSH_CMD="${SSH_PATH} ${MYSQL_SLAVE_IP}"

GZIP_CMD="/bin/gzip"


LOG_PATH=/usr/local/mysql/log

DATA_PATH=/usr/local/mysql/data

LOG_FILE=${LOG_PATH}/mysqllog_`date +%F`.log

DATA_FILE=${DATA_PATH}/mysql_backup_`date +%F`.sql.gz


BIN_PATH=/usr/local/mysql/bin

MYSQL_CMD="$BIN_PATH/mysql -u$MYSQL_USER -p$MYSQL_PW"

MYSQL_DUMP="$BIN_PATH/mysqldump -u$MYSQL_USER -p$MYSQL_PW --opt --flush-logs --all-database"


$MYSQL_CMD -e "flush tables with read lock;"

echo "-------show master status result-------" >> $LOG_FILE

$MYSQL_CMD -e "show master status" >> $LOG_FILE

${MYSQL_DUMP}|gzip > $DATA_FILE


#config slave

cd ${DATA_PATH}

scp "mysql_backup_`date +%F`.sql.gz" $MYSQL_SLAVE_IP:/tmp/

${SSH_CMD} "${GZIP_CMD} -d /tmp/mysql_backup_`date +%F`.sql.gz"

${SSH_CMD} "${MYSQL_CMD} < /tmp/mysql_backup_`date +%F`.sql"


${SSH_CMD} "cat |$MYSQL_CMD" << EOF

stop slave;

change master to

master_host='192.168.100.90',

master_user='slave',

master_password='123456',

master_log_file="bin.000009",

master_log_pos= 120;

start slave;

EOF


$SSH_CMD $MYSQL_CMD -e "show slave status\G;"|egrep "IO_Running|SQL_Running" >> $LOG_FILE


$MYSQL_CMD -e "unlock tables"

mail -s "mysql slave log" 1234567@qq.com < $LOG_FILE

$SSH_CMD mail -s "mysql slave log" 1234567@qq.com < $LOG_FILE

------------------


mysql主从my.cnf参数配置:

--------------------------------

[mysqld]

port= 3306

datadir=/usr/local/mysql/data

socket=/var/lib/mysql/mysql.sock

user=mysql

symbolic-links=0

max_connections = 16384

skip-external-locking

skip-name-resolve


key_buffer_size = 256M

query_cache_limit = 1M

query_cache_size = 64M

max_allowed_packet = 16M

#table_cache = 8


thread_concurrency = 8


sort_buffer_size = 8M

read_buffer_size = 4M

read_rnd_buffer_size = 4M

net_buffer_length = 1M

thread_stack = 1M


log-error=/usr/local/mysql/log/error.log

log=/usr/local/mysql/log/mysql.log

long_query_time=2

log-slow-queries= /usr/local/mysql/log/slowquery.log


# 服务器ID号(主为1从为2)

server-id = 1

# 忽略mysql系统库复制

binlog-ignore-db=mysql

binlog-ignore-db=information_schema

log-bin = /usr/local/mysql/log/bin.log

# 删除10天之前的二进制日志

expire_logs_days = 10


[mysqldump]

quick

max_allowed_packet = 16M


[mysql]

no-auto-rehash

#safe-updates


[isamchk]

key_buffer = 8M

sort_buffer_size = 8M


[myisamchk]

key_buffer = 8M

sort_buffer_size = 8M


[mysqlhotcopy]

interactive-timeout

--------------------------------


-------大功告成---------




     本文转自 showerlee 51CTO博客,原文链接:http://blog.51cto.com/showerlee/1220801,如需转载请自行联系原作者


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
安全 关系型数据库 MySQL
CentOS 7 yum 安装 MySQL教程
在CentOS 7上安装MySQL 8,其实流程很清晰。首先通过官方Yum仓库来安装服务,然后启动并设为开机自启。最重要的环节是首次安全设置:需要先从日志里找到临时密码来登录,再修改成你自己的密码,并为远程连接创建用户和授权。最后,也别忘了在服务器防火墙上放行3306端口,这样远程才能连上。
2920 16
|
存储 关系型数据库 MySQL
在CentOS 8.x上安装Percona Xtrabackup工具备份MySQL数据步骤。
以上就是在CentOS8.x上通过Perconaxtabbackup工具对Mysql进行高效率、高可靠性、无锁定影响地实现在线快速全量及增加式数据库资料保存与恢复流程。通过以上流程可以有效地将Mysql相关资料按需求完成定期或不定期地保存与灾难恢复需求。
965 10
|
关系型数据库 MySQL 索引
MySQL多表练习笔记
链接可行,多表查询语法
273 0
|
关系型数据库 MySQL Linux
CentOS 7系统下详细安装MySQL 5.7的步骤:包括密码配置、字符集配置、远程连接配置
以上就是在CentOS 7系统下安装MySQL 5.7的详细步骤。希望这个指南能帮助你顺利完成安装。
3600 26
|
SQL 网络协议 关系型数据库
MySQL 主从复制
主从复制是 MySQL 实现数据冗余和高可用性的关键技术。主库通过 binlog 记录操作,从库异步获取并回放这些日志,确保数据一致性。搭建主从复制需满足:多个数据库实例、主库开启 binlog、不同 server_id、创建复制用户、从库恢复主库数据、配置复制信息并开启复制线程。通过 `change master to` 和 `start slave` 命令启动复制,使用 `show slave status` 检查同步状态。常见问题包括 IO 和 SQL 线程故障,可通过重置和重新配置解决。延时原因涉及主库写入延迟、DUMP 线程性能及从库 SQL 线程串行执行等,需优化配置或启用并行处理
488 40
|
关系型数据库 MySQL 数据库
RDS用多了,你还知道MySQL主从复制底层原理和实现方案吗?
随着数据量增长和业务扩展,单个数据库难以满足需求,需调整为集群模式以实现负载均衡和读写分离。MySQL主从复制是常见的高可用架构,通过binlog日志同步数据,确保主从数据一致性。本文详细介绍MySQL主从复制原理及配置步骤,包括一主二从集群的搭建过程,帮助读者实现稳定可靠的数据库高可用架构。
1137 9
RDS用多了,你还知道MySQL主从复制底层原理和实现方案吗?
|
SQL 存储 关系型数据库
MySQL主从复制 —— 作用、原理、数据一致性,异步复制、半同步复制、组复制
MySQL主从复制 作用、原理—主库线程、I/O线程、SQL线程;主从同步要求,主从延迟原因及解决方案;数据一致性,异步复制、半同步复制、组复制
2184 11
|
安全 关系型数据库 MySQL
CentOS7仅安装部署MySQL80客户端
通过上述步骤,你可以在CentOS 7上成功安装并配置MySQL 8.0客户端。这个过程确保你能够使用MySQL客户端工具连接和管理远程的MySQL数据库,而不需要在本地安装MySQL服务器。定期更新MySQL客户端可以确保你使用的是最新的功能和安全修复。
1698 16
|
NoSQL 关系型数据库 Redis
《docker高级篇(大厂进阶):1.Docker复杂安装详说》包括:安装mysql主从复制、安装redis集群
《docker高级篇(大厂进阶):1.Docker复杂安装详说》包括:安装mysql主从复制、安装redis集群
569 14
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
729 158