Linux环境中MySQL主从同步--添加新的从库

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:
原创作品,允许转载,转载时请务必以超链接形式标明文章  原始出处 、作者信息和本声明。否则将追究法律责任。 http://dgd2010.blog.51cto.com/1539422/1689171

当前我认为数据库主从有两大应用价值:

1.从库相当于主库的备份。虽然数据库的主从并不能代替/取代备份,例如错误的数据可能毁掉所有的数据库,但主从也是在一种可读的状态下保持备份的一种实现方式。

2.从库可以缓解主库的压力,能提高性能。由于从库是只读的,因此在读取查询方面,从库可以代替主库,承担一定的压力,无论是这些压力是来自用户(应用程序)还是开发、运维自己。

MySQL的主从其实并不困难,而且需要做的事情也并不多,mysql官方给出的文档中对主从也做出了详细的指导、说明和解释,但总共也多少篇幅。鉴于很多网友已经详细叙写了相关的文档或文章,此处就能不赘述了(也可以略微参考本文的最后一部分“数据库主从的配置过程中使用的一些命令和步骤”)。

简单说几句关于添加新的从库的小技巧。

因为添加从库时,需要知道MASTER_LOG_FILE和MASTER_LOG_POS,虽然通过在master主库上执行“show master status”能看到当前的MASTER_LOG_FILE和MASTER_LOG_POS,但实际上这种方法只能用于master主库刚开始用的情况下,即数据库刚建好,没有任何数据写入的情况下,或者能将这些数据先手动同步到从库中去。

一种较为方便的方法就是,通过mysqldump导出主库的数据库,同时导出事件、触发器、函数和视图,以及master-data,这样通过查看mysqldump导出的文件的前几行就能找到MASTER_LOG_FILE和MASTER_LOG_POS,这时在将从主库导出的sql语句在从库执行以后,就可以通过这一个MASTER_LOG_FILE和MASTER_LOG_POS,配置好从库,并开始同步。

关于mysqldump的详细说明以及MySQL数据库的的备份脚本可以参考文章《Linux Shell脚本之利用mysqldump备份MySQL数据库(详细注解)》以及文章中的评论。

通过mysqldump导出主库的数据库,同时导出事件、触发器、函数和视图,以及master-data:

1
/usr/local/mysql/bin/mysqldump  -uusername -hipaddress  -ppassword -Pport --routines --events --triggers --single-transaction --flush-logs --master-data=1 –databases databasename

如果想单独导出事件、触发器、函数和视图等而不导出数据,则可以执行:

1
/usr/local/mysql/bin/mysqldump  -uusername -hipaddress  -ppassword -Pport --routines --events --triggers --no-create-info --no-data --no-create-db

此外将一个数据库主从的配置过程中使用的一些命令和步骤陈列如下,以作参考或备忘:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
# Sat Aug 22 11:23:03 CST 2015
# Get mysql 5.5.38 for production use
# https://downloads.mariadb.com/archive/index/p/mysql/v/5.5.38
# https://downloads.mariadb.com/archives/mysql-5.5/mysql-5.5.38.tar.gz
wget -c https: //downloads .mariadb.com /archives/mysql-5 .5 /mysql-5 .5.38-linux2.6-x86_64. tar .gz
 
# Remove some conflicts
rpm -e mysql-server mysql
userdel mysql
rm  -rf  /usr/local/mysql/
rm  -f  /etc/my .cnf
 
#  Set user and group
groupadd -r -g 27 mysql 
useradd  -r -u 27 -g mysql mysql -c  "MySQL Server"  -d  /dev/null  -s  /sbin/nologin
 
groupadd -r mysql 
useradd  -r -g mysql mysql -c  "MySQL Server"  -d  /dev/null  -s  /sbin/nologin
 
 
# Install  MySQL database 
tar  zxf mysql-5.5.38-linux2.6-x86_64. tar .gz
cp  -r mysql-5.5.38-linux2.6-x86_64  /usr/local/mysql
# /usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql --explicit_defaults_for_timestamp --skip-name-resolve
/usr/local/mysql/scripts/mysql_install_db  --basedir= /usr/local/mysql  --datadir= /data/mysql/data  --user=mysql --skip-name-resolve
 
# Run it temporarily 
# /usr/local/mysql/bin/mysqld_safe &
/usr/local/mysql/bin/mysqld_safe  --defaults- file = /etc/my .cnf &
 
# Set mysql commands 
ln  -s  /usr/local/mysql/bin/mysql  /usr/bin/mysql
ln  -s  /usr/local/mysql/bin/mysqladmin  /usr/bin/mysqladmin
ln  -s  /usr/local/mysql/bin/mysqldump  /usr/bin/mysqldump
ln  -s  /usr/local/mysql/bin/mysqlbinlog  /usr/bin/mysqlbinlog
ln  -s  /usr/local/mysql/bin/mysql_config  /usr/bin/mysql_config
 
# set mysql root password, etc
/usr/local/mysql/bin/mysql_secure_installation
 
# Set mysql library 
ln  -s  /usr/local/mysql/lib/libmysqlclient .so.18.0.0  /usr/lib64/libmysqlclient .so.18.0.0
ln  -s  /usr/local/mysql/lib/libmysqlclient .so.18.0.0  /usr/lib64/libmysqlclient .so.18
ln  -s  /usr/local/mysql/lib/libmysqlclient .so.18.0.0  /usr/lib64/libmysqlclient .so
ls  -l  /usr/lib64/libmysqlclient .so.18.0.0
ls  -l  /usr/lib64/libmysqlclient .so.18
ls  -l  /usr/lib64/libmysqlclient .so
vim  /etc/ld .so.conf.d /mysql-x86_64 .conf 
     /usr/lib64/mysql 
     /usr/local/mysql/lib
ldconfig
 
# Set mysql replication 
# master db
cp  /usr/local/mysql/support-files/my-small .cnf  /etc/my .cnf
sed  -i  "s@server-id\t= 1@server-id       = 101@g"  /etc/my .cnf
sed  -i  "s@#log-bin=mysql-bin@log-bin=mysql-bin@g"  /etc/my .cnf
sed  -i  "s@#binlog_format=mixed@binlog_format=mixed@g"  /etc/my .cnf
# slave db
cp  /usr/local/mysql/support-files/my-small .cnf  /etc/my .cnf
sed  -i  "s@server-id\t= 1@server-id       = 103@g"  /etc/my .cnf
 
# read errors from logs
cat  /usr/local/mysql/data/ ` hostname `.err
 
# Some reference
# server-id = 101
# log-bin=/usr/local/mysql/data/bin-log
# max_binlog_size = 1500M
# binlog_cache_size = 128K
# binlog-do-db = devdbops
# binlog-ignore-db = mysql
# log-slave-updates
# expire_logs_day=2
# binlog_format=mixed
 
# end mysql temporarily
kill  -TERM ` ps  -ef |  awk  '/mysqld_safe/ && ! /awk/ {print $2}' ` ||  kill  -KILL ` ps  -ef |  awk  '/mysqld_safe/ && ! /awk/ {print $2}' `
ps  -ef |  awk  '/mysqld_safe/ && ! /awk/ {print $2}'
kill  -TERM ` ps  -ef |  awk  '/mysqld/ && ! /awk/ {print $2}' ` ||  kill  -KILL ` ps  -ef |  awk  '/mysqld/ && ! /awk/ {print $2}' `
ps  -ef |  awk  '/mysqld/ && ! /awk/ {print $2}'
 
# Setting sysvinit 
cp  /usr/local/mysql/support-files/mysql .server  /etc/init .d /mysql
chmod  +x  /etc/init .d /mysql
 
# Start mysql database
service mysql start
service mysql status
 
# some operation about replicaion
# master db
GRANT ALL PRIVILEGES ON *.* TO root@ "%"  IDENTIFIED BY  "root" ;
FLUSH PRIVILEGES;
CREATE USER  'dev' @ '%'  IDENTIFIED BY  'dev' ;
CREATE DATABASE IF NOT EXISTS devdbops;
GRANT ALTER,ALTER ROUTINE,CREATE,CREATE ROUTINE,CREATE TEMPORARY TABLES,CREATE VIEW,DELETE,DROP,EXECUTE,INDEX,INSERT,LOCK TABLES,SELECT,UPDATE,SHOW VIEW ON devdbops.* TO  'dev' @ "%" ;
USE devdbops;
CREATE TABLE `testtable` (
` id `  int NOT NULL ,
`name`  varchar(255) NULL ,
`value`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL ,
PRIMARY KEY (` id `)
)
;
INSERT INTO `testtable` (` id `, `name`, `value`) VALUES ( '0' 'a' 'b' );
# CREATE USER 'repl'@'%.mydomain.com' IDENTIFIED BY 'slavepass';
# GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%.mydomain.com';
# CREATE USER 'repl'@'%' IDENTIFIED BY 'slavepass';
# GRANT REPLICATION SLAVE ON devdbops.* to 'replication'@'%';
SHOW MASTER STATUS;
SHOW PROCESSLIST \G;
SHOW SLAVE HOSTS;
QUIT;
 
# slave db
STOP SLAVE;
CHANGE MASTER TO MASTER_HOST= '192.168.1.101' ,MASTER_USER= 'root' ,MASTER_PASSWORD= 'root' ,MASTER_LOG_FILE= 'mysql-bin.000002' ,MASTER_LOG_POS=107;
START SLAVE;
SHOW SLAVE STATUS \G;
 
# Read for test

tag:mysql主从配置,mysql添加从库,mysql备份视图函数,mysql备份脚本,Linux安装mysql

--end--

本文出自 “通信,我的最爱” 博客,请务必保留此出处http://dgd2010.blog.51cto.com/1539422/1689171

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
27天前
|
关系型数据库 MySQL Linux
Linux环境下MySQL数据库自动定时备份实践
数据库备份是确保数据安全的重要措施。在Linux环境下,实现MySQL数据库的自动定时备份可以通过多种方式完成。本文将介绍如何使用`cron`定时任务和`mysqldump`工具来实现MySQL数据库的每日自动备份。
62 3
|
27天前
|
监控 关系型数据库 MySQL
Linux环境下MySQL数据库自动定时备份策略
在Linux环境下,MySQL数据库的自动定时备份是确保数据安全和可靠性的重要措施。通过设置定时任务,我们可以每天自动执行数据库备份,从而减少人为错误和提高数据恢复的效率。本文将详细介绍如何在Linux下实现MySQL数据库的自动定时备份。
34 3
|
1月前
|
关系型数据库 MySQL Linux
Linux系统如何设置自启动服务在MySQL数据库启动后执行?
【10月更文挑战第25天】Linux系统如何设置自启动服务在MySQL数据库启动后执行?
93 3
|
2月前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
106 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
22天前
|
监控 Linux
如何检查 Linux 内存使用量是否耗尽?这 5 个命令堪称绝了!
本文介绍了在Linux系统中检查内存使用情况的5个常用命令:`free`、`top`、`vmstat`、`pidstat` 和 `/proc/meminfo` 文件,帮助用户准确监控内存状态,确保系统稳定运行。
131 6
|
23天前
|
Linux
在 Linux 系统中,“cd”命令用于切换当前工作目录
在 Linux 系统中,“cd”命令用于切换当前工作目录。本文详细介绍了“cd”命令的基本用法和常见技巧,包括使用“.”、“..”、“~”、绝对路径和相对路径,以及快速切换到上一次工作目录等。此外,还探讨了高级技巧,如使用通配符、结合其他命令、在脚本中使用,以及实际应用案例,帮助读者提高工作效率。
64 3
|
23天前
|
监控 安全 Linux
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景,包括 ping(测试连通性)、traceroute(跟踪路由路径)、netstat(显示网络连接信息)、nmap(网络扫描)、ifconfig 和 ip(网络接口配置)。掌握这些命令有助于高效诊断和解决网络问题,保障网络稳定运行。
58 2
|
1月前
|
缓存 监控 Linux
|
1月前
|
Linux Shell 数据安全/隐私保护
|
18天前
|
运维 监控 网络协议
运维工程师日常工作中最常用的20个Linux命令,涵盖文件操作、目录管理、权限设置、系统监控等方面
本文介绍了运维工程师日常工作中最常用的20个Linux命令,涵盖文件操作、目录管理、权限设置、系统监控等方面,旨在帮助读者提高工作效率。从基本的文件查看与编辑,到高级的网络配置与安全管理,这些命令是运维工作中的必备工具。
54 3