同步RDS数据库到自建mysql数据库

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 同步RDS数据库到自建mysql数据库

文本只是新手级别(临时遇上,硬着头皮上的这种,从 RDS 同步到本地mysql的教程很少,而且有些情况还不太一样,来来回来折腾了一周才出了结果),很多my.cnf 里的参数都不知所以,所以基本上都是照搬 RDS 里面的参数,一句一句的查,然后写到本地的 my.cnf 里面,希望我的经验能帮到有需要的各位。

备份恢复到本地的相关说明,请参考https://help.aliyun.com/knowledge_detail/41817.html

本例环境为 Mysql5.6
阿里云 RDS / Mysql 5.6
本地环境Ubuntu 14.04 / Mysql 5.6

1.安装Percona Xtrabackup

wget https://repo.percona.com/apt/percona-release_0.1-5.(lsb_release -sc)_all.deb
dpkg -i percona-release_0.1-5.$(lsb_release -sc)_all.deb
apt-get update
apt-get install percona-xtrabackup-24

2.安装Mysql服务和客户端

apt-get install mysql-server-5.6 mysql-client-5.6
/etc/init.d/mysql stop

3.下载数据库备份文件

wget -c '<数据备份文件外网下载地址>' -O <自定义文件名>.tar.gz

4.解压备份文件

bash rds_backup_extract.sh -f <数据备份文件名>.tar.gz -C /home/mysql/data

5.恢复解压好的文件

innobackupex --defaults-file=/home/mysql/data/backup-my.cnf --apply-log /home/mysql/data

6.修改backup-my.cnf参数

vim /home/mysql/data/backup-my.cnf

# This MySQL options file was generated by >>innobackupex.
# The MySQL server
# 以下参数请勿直接复制,注释的5个参数是固定的,不然启动会报错
[mysqld]
innodb_checksum_algorithm=innodb
#innodb_log_checksum_algorithm=innodb
innodb_data_file_path=ibdata1:200M:autoextend
innodb_log_files_in_group=2
innodb_log_file_size=1048576000
#innodb_fast_checksum=false
innodb_page_size=16384
#innodb_log_block_size=512
innodb_undo_directory=.
innodb_undo_tablespaces=0
#rds_encrypt_data=false
#innodb_encrypt_algorithm=aes_128_ecb

7.修改文件属主

chown -R mysql:mysql /home/mysql/data

8.启动MySQL进程

mysqld_safe --defaults-file=/home/mysql/data/backup-my.cnf --user=mysql --datadir=/home/mysql/data

9.登录MySQL数据库进行修改

注:删除表示因为无法设置 slave ,需要重新导入(mysql 自带)
mysql -uroot

mysql>delete from mysql.db where user<>'root' and char_length(user)>0;delete from mysql.tables_priv where user<>'root' and char_length(user)>0;flush privileges;
mysql>use mysql;
mysql>drop table slave_master_info;
mysql>drop table slave_relay_log_info;
mysql>drop table slave_worker_info;
mysql>drop table innodb_index_stats;
mysql>drop table innodb_table_stats;
mysql>source /usr/share/mysql/mysql_system_tables.sql
mysql>quit

10.修改my.cnf(把backup-my.cnf参数复制到my.cnf)

mysqladmin shutdown
vim /etc/mysql/my.cnf

[client]

port = 3306
socket = /var/run/mysqld/mysqld.sock
[mysqld_safe]
socket = /var/run/mysqld/mysqld.sock
nice = 0

[mysqld]

user = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
basedir = /usr
datadir = /home/mysql/data
tmpdir = /tmp
lc-messages-dir = /usr/share/mysql
skip-external-locking
myisam-recover = BACKUP
log_error = /var/log/mysql/error.log
#阿里云RDS优化配置
auto_increment_increment = 1
auto_increment_offset = 1
back_log = 3000
binlog_cache_size = 1M
binlog_checksum = CRC32
binlog_row_image = full
binlog_stmt_cache_size = 32768
character_set_server = utf8
concurrent_insert = 1
connect_timeout = 10
default_storage_engine = InnoDB
default_time_zone = SYSTEM
default_week_format = 0
delayed_insert_limit = 100
delayed_insert_timeout = 300
delayed_queue_size = 1000
delay_key_write = ON
div_precision_increment = 4
eq_range_index_dive_limit = 10
explicit_defaults_for_timestamp = false
ft_min_word_len = 4
ft_query_expansion_limit = 20
group_concat_max_len = 1024
innodb_adaptive_hash_index = ON
innodb_additional_mem_pool_size = 2097152
innodb_autoinc_lock_mode = 1
innodb_concurrency_tickets = 500
innodb_ft_max_token_size = 84
innodb_ft_min_token_size = 3
innodb_large_prefix = 0
innodb_lock_wait_timeout = 50
innodb_max_dirty_pages_pct = 75
innodb_old_blocks_pct = 37
innodb_old_blocks_time = 0
innodb_online_alter_log_max_size = 134217728
innodb_open_files = 300
innodb_print_all_deadlocks = OFF
innodb_purge_batch_size = 20
innodb_purge_threads = 1
innodb_read_ahead_threshold = 56
innodb_read_io_threads = 4
innodb_rollback_on_timeout = OFF
innodb_stats_method = nulls_equal
innodb_stats_on_metadata = OFF
innodb_stats_sample_pages = 8
innodb_strict_mode = OFF
innodb_table_locks = ON
innodb_thread_concurrency = 0
innodb_thread_sleep_delay = 10000
innodb_write_io_threads = 4
interactive_timeout = 7200
key_cache_age_threshold = 300
key_cache_block_size = 1024
key_cache_division_limit = 100
log_queries_not_using_indexes = OFF
long_query_time = 1
#loose_max_statement_time = 0
#loose_rds_indexstat = OFF
#loose_rds_max_tmp_disk_space = 10737418240
#loose_rds_tablestat = ON
#loose_rds_threads_running_high_watermark = 50000
#loose_tokudb_buffer_pool_ratio = 0
lower_case_table_names = 1
low_priority_updates = 0
max_allowed_packet = 1024M
max_connect_errors = 20
max_length_for_sort_data = 1024
max_prepared_stmt_count = 16382
max_write_lock_count = 102400
myisam_sort_buffer_size = 262144
net_read_timeout = 30
net_retry_count = 10
net_write_timeout = 60
open_files_limit = 65535
performance_schema = OFF
query_alloc_block_size = 8192
query_cache_limit = 1048576
query_cache_size = 0
query_cache_type = 1
query_cache_wlock_invalidate = OFF
query_prealloc_size = 8192
#rds_reset_all_filter = 0
slow_launch_time = 2
sql_mode =
table_definition_cache = 512
table_open_cache = 2000
thread_stack = 262144
tmp_table_size = 262144
transaction_isolation = READ-COMMITTED
wait_timeout = 86400
#优化结束
#GTID设置
server-id = 148
log-bin = mysql.bin
log-bin-index = mysql-bin.index
log-slave-updates = 1
skip_slave_start = 1
relay-log = relay-log
relay_log_index = relay-log.index
expire_logs_days = 0
max_binlog_size = 500M
default-storage-engine=INNODB
master-info-repository=TABLE
relay-log-info_repository=TABLE
binlog-format=ROW
gtid-mode=on
enforce-gtid-consistency=true
#backup-my.cnf参数
innodb_checksum_algorithm=innodb
#innodb_log_checksum_algorithm=innodb
innodb_data_file_path=ibdata1:200M:autoextend
innodb_log_files_in_group=2
innodb_log_file_size=1048576000
#innodb_fast_checksum=false
innodb_page_size=16384
#innodb_log_block_size=512
innodb_undo_directory=.
innodb_undo_tablespaces=0
#backup-my.cnf结束
replicate-ignore-db=mysql
replicate-ignore-db=test
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema
replicate-do-db=db1
replicate-do-db=db2
#GTID结束
[mysqldump]
quick
quote-names
max_allowed_packet = 16M

[mysql]

[isamchk]

key_buffer = 16M
!includedir /etc/mysql/conf.d/

注:my.cnf的参数可以参考RDS的参数,我这里是照搬,请自己对照情况进行修改。

11.设置slave(请先在rds控制台创建一个用来同步的账户,建议只读)

/etc/init.d/mysql/restart

cat /home/data/mysql/xtrabackup_slave_info
#文件里面就两段字,复制下来,待会在 mysql 里面写入。
mysql -uroot

mysql>SET GLOBAL gtid_purged='xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx:1-123456';
mysql>CHANGE MASTER TO MASTER_HOST='RDS外网地址', MASTER_PORT=3306, MASTER_USER='同步账号', MASTER_PASSWORD='同步密码', MASTER_AUTO_POSITION=1;
mysql>START SLAVE;
mysql>SHOW SLAVE STATUS G



问题解答

1.首次启动数据库出现如下提示

[ERROR] InnoDB: ./ibdata1 can't be opened in read-write mode

[ERROR] InnoDB: The system tablespace must be writable!
[ERROR] Plugin 'InnoDB' init function returned error.
[ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
[ERROR] Unknown/unsupported storage engine: InnoDB
[ERROR] Aborting

PS:重启服务器即可,删除ib*什么的不管用。

2.unknown variable 'xxxx'

[ERROR]/usr/sbin/mysqld: unknown variable 'xxxx'

PS:到my.cnf里面注释xxxx

3.Table './mysql/xxx' 报错

[ERROR] /usr/sbin/mysqld: Table './mysql/db' is marked as crashed and should be repaired

[Warning] Checking table: './mysql/db'
[ERROR] 1 client is using or hasn't closed the table properly
[ERROR] /usr/sbin/mysqld: Table './mysql/event' is marked as crashed and should be repaired
[Warning] Checking table: './mysql/event'
[ERROR] 1 client is using or hasn't closed the table properly

PS:使用myisamchk -c -r /home/mysql/data/db/tablesname.MYI修复即可

4.information that should help you find out what is causing the crash.

It is possible that mysqld could use up to

key_buffer_size + (read_buffer_size + sort_buffer_size)*max_threads = 68104 K bytes of memory
Hope that's ok; if not, decrease some variables in the equation.
Thread pointer: 0xxxxxxxxxxxxx
Attempting backtrace. You can use the following information to find out
where mysqld died. If you see no messages after this, something went
terribly wrong...

PS:...他只是卡住了而已,my.cnf里面部分参数设置不当,等一会就可以连了。。别问我为什么知道。。

5.同步时报1236错误

[ERROR] Error reading packet from server: The slave is connecting using CHANGE MASTER TO MASTER_AUTO_POSITION = 1, but the master has purged binary logs containing GTIDs that the slave requires. (server_errno=1236)

ERROR] Slave I/O: Got fatal error 1236 from master when reading data from binary log: 'The slave is connecting using CHANGE MASTER TO MASTER_AUTO_POSITION = 1, but the master has purged binary logs containing GTIDs that the slave requires.', Error_code: 1236
[ERROR] Error reading packet from server: The slave is connecting using CHANGE MASTER TO MASTER_AUTO_POSITION = 1, but the master has purged binary logs containing GTIDs that the slave requires. (server_errno=1236)

PS:重新从RDS获取新的备份(当前的新备份)

最后,本地my.cnf里面的配置,如果你不知道有些参数数值应该设置多少,可以登陆RDS服务器使用show命令进行查询,查询到的数值单位是字节,不会换算自己百度用工具换算一下就行,上文中关于my.cnf阿里云优化的部分,全部使用了RDS控制台里面的参数(导出复制进去就行,记得注释掉有rds的参数),RDS里面没有的参数,你本地可以直接注释掉。

对于GTID的参数,除了 server-id 不能与 master 一样,其他的都可以从 RDS 里面查询。

以上,遇到问题欢迎留言。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1天前
|
关系型数据库 MySQL Linux
在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。
本文介绍了在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。同时,文章还对比了编译源码安装与使用 RPM 包安装的优缺点,帮助读者根据需求选择最合适的方法。通过具体案例,展示了编译源码安装的灵活性和定制性。
18 2
|
4天前
|
存储 关系型数据库 MySQL
MySQL vs. PostgreSQL:选择适合你的开源数据库
在众多开源数据库中,MySQL和PostgreSQL无疑是最受欢迎的两个。它们都有着强大的功能、广泛的社区支持和丰富的生态系统。然而,它们在设计理念、性能特点、功能特性等方面存在着显著的差异。本文将从这三个方面对MySQL和PostgreSQL进行比较,以帮助您选择更适合您需求的开源数据库。
20 4
|
9天前
|
存储 监控 关系型数据库
MySQL并发控制与管理:优化数据库性能的关键
【10月更文挑战第17天】MySQL并发控制与管理:优化数据库性能的关键
31 0
|
9天前
|
存储 SQL 关系型数据库
MySQL Workbench支持哪些数据库引擎
【10月更文挑战第17天】MySQL Workbench支持哪些数据库引擎
8 0
|
18天前
|
存储 SQL 关系型数据库
Mysql学习笔记(二):数据库命令行代码总结
这篇文章是关于MySQL数据库命令行操作的总结,包括登录、退出、查看时间与版本、数据库和数据表的基本操作(如创建、删除、查看)、数据的增删改查等。它还涉及了如何通过SQL语句进行条件查询、模糊查询、范围查询和限制查询,以及如何进行表结构的修改。这些内容对于初学者来说非常实用,是学习MySQL数据库管理的基础。
78 6
|
16天前
|
存储 关系型数据库 MySQL
Mysql(4)—数据库索引
数据库索引是用于提高数据检索效率的数据结构,类似于书籍中的索引。它允许用户快速找到数据,而无需扫描整个表。MySQL中的索引可以显著提升查询速度,使数据库操作更加高效。索引的发展经历了从无索引、简单索引到B-树、哈希索引、位图索引、全文索引等多个阶段。
50 3
Mysql(4)—数据库索引
|
18天前
|
SQL Ubuntu 关系型数据库
Mysql学习笔记(一):数据库详细介绍以及Navicat简单使用
本文为MySQL学习笔记,介绍了数据库的基本概念,包括行、列、主键等,并解释了C/S和B/S架构以及SQL语言的分类。接着,指导如何在Windows和Ubuntu系统上安装MySQL,并提供了启动、停止和重启服务的命令。文章还涵盖了Navicat的使用,包括安装、登录和新建表格等步骤。最后,介绍了MySQL中的数据类型和字段约束,如主键、外键、非空和唯一等。
57 3
Mysql学习笔记(一):数据库详细介绍以及Navicat简单使用
|
23天前
|
缓存 算法 关系型数据库
Mysql(3)—数据库相关概念及工作原理
数据库是一个以某种有组织的方式存储的数据集合。它通常包括一个或多个不同的主题领域或用途的数据表。
43 5
Mysql(3)—数据库相关概念及工作原理
|
10天前
|
存储 关系型数据库 MySQL
如何在MySQL中创建数据库?
【10月更文挑战第16天】如何在MySQL中创建数据库?
|
14天前
|
SQL Oracle 关系型数据库
安装最新 MySQL 8.0 数据库(教学用)
安装最新 MySQL 8.0 数据库(教学用)
76 4