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

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
2月前
|
安全 关系型数据库 MySQL
如何将数据从MySQL同步到其他系统
【10月更文挑战第17天】如何将数据从MySQL同步到其他系统
301 0
|
4天前
|
监控 关系型数据库 MySQL
Flink CDC MySQL同步MySQL错误记录
在使用Flink CDC同步MySQL数据时,常见的错误包括连接错误、权限错误、表结构变化、数据类型不匹配、主键冲突和
34 16
|
2天前
|
NoSQL 关系型数据库 MySQL
Linux安装jdk、mysql、redis
Linux安装jdk、mysql、redis
51 7
|
13天前
|
存储 编译器 Linux
动态链接的魔法:Linux下动态链接库机制探讨
本文将深入探讨Linux系统中的动态链接库机制,这其中包括但不限于全局符号介入、延迟绑定以及地址无关代码等内容。
182 19
|
21天前
|
关系型数据库 MySQL Linux
MySQL数据库下载安装教程(Windows&Linux)
本文档详细介绍了MySQL的安装步骤,包括安装前的准备工作、下载安装包、Windows和Linux系统下的具体安装流程,以及如何配置MySQL服务、设置环境变量、启动服务和连接数据库等关键操作。
|
1月前
|
关系型数据库 MySQL Linux
Linux环境下MySQL数据库自动定时备份实践
数据库备份是确保数据安全的重要措施。在Linux环境下,实现MySQL数据库的自动定时备份可以通过多种方式完成。本文将介绍如何使用`cron`定时任务和`mysqldump`工具来实现MySQL数据库的每日自动备份。
108 3
|
1月前
|
监控 关系型数据库 MySQL
Linux环境下MySQL数据库自动定时备份策略
在Linux环境下,MySQL数据库的自动定时备份是确保数据安全和可靠性的重要措施。通过设置定时任务,我们可以每天自动执行数据库备份,从而减少人为错误和提高数据恢复的效率。本文将详细介绍如何在Linux下实现MySQL数据库的自动定时备份。
47 3
|
1月前
|
关系型数据库 MySQL Linux
Linux系统如何设置自启动服务在MySQL数据库启动后执行?
【10月更文挑战第25天】Linux系统如何设置自启动服务在MySQL数据库启动后执行?
120 3
|
3天前
|
存储 Oracle 关系型数据库
数据库传奇:MySQL创世之父的两千金My、Maria
《数据库传奇:MySQL创世之父的两千金My、Maria》介绍了MySQL的发展历程及其分支MariaDB。MySQL由Michael Widenius等人于1994年创建,现归Oracle所有,广泛应用于阿里巴巴、腾讯等企业。2009年,Widenius因担心Oracle收购影响MySQL的开源性,创建了MariaDB,提供额外功能和改进。维基百科、Google等已逐步替换为MariaDB,以确保更好的性能和社区支持。掌握MariaDB作为备用方案,对未来发展至关重要。
13 3
|
3天前
|
安全 关系型数据库 MySQL
MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!
《MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!》介绍了MySQL中的三种关键日志:二进制日志(Binary Log)、重做日志(Redo Log)和撤销日志(Undo Log)。这些日志确保了数据库的ACID特性,即原子性、一致性、隔离性和持久性。Redo Log记录数据页的物理修改,保证事务持久性;Undo Log记录事务的逆操作,支持回滚和多版本并发控制(MVCC)。文章还详细对比了InnoDB和MyISAM存储引擎在事务支持、锁定机制、并发性等方面的差异,强调了InnoDB在高并发和事务处理中的优势。通过这些机制,MySQL能够在事务执行、崩溃和恢复过程中保持
18 3