900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > 阿里云RDS(Mysql)与ECS自己搭建的数据库做主从

阿里云RDS(Mysql)与ECS自己搭建的数据库做主从

时间:2024-06-08 10:10:31

相关推荐

阿里云RDS(Mysql)与ECS自己搭建的数据库做主从

阿里云RDS(Mysql)与ECS自己搭建的数据库做主从

第二篇博客,鼓励一下自己!

背景介绍:

公司要对线上部分业务数据进行数据分析,数据分析选择的是第三方平台(这里就不说那个平台是什么啦),第三方平台可以直连我们的RDS数据数据库,但是需要提供用户名,密码,地址,所以为了防止其它数据被泄露,需要自己再搭建一个从库,只同步一部分RDS的数据;因此需要自己再搭建一个数据库来同步RDS的一部分数据,自己搭建的数据库服务器用的是阿里云的ECS。

名词:

主-master

从-slave

步骤:

第一步:准备好创建RDS实例(这里自己看阿里云的帮助文档即可),用超级管理员的账号创建一个子用户,并赋予一些权限,具体命令如下:

create user 'userName'@'databaseName' identified by 'password'; //databaseName:数据库名称,可以用%,代表所有的数据库 grant REPLICATION SLAVE,Replication client,reload on *.* to 'userName'@'%' identified by 'password';REPLICATION SLAVE则是一个必须而基本的权限,它直接授予slave服务器以该账户连接master后可以执行replicate操作的权利REPLICATION CLIENT 使得用户可以使用SHOW MASTER STATUS和SHOW SLAVE STATUS命令,也就是说这个权限是用于授予账户监视Replication状况的权力。reload 是 administrative 级的权限,即 server administration;

第二步:在一台ECS上搭建mysql数据库(作从库使用):这个比较容易,自己在百度搜索就能找到

第三步:安装完成后配置f文件(该文件位于/etc/f)

①用命令编辑该文件:vim/etc/f

②在该文件的[mysqld]部分添加:下面的配置:

#服务的idserver_id=211#只读read_only = 1#端口号port = 3306#复制要同步的数据库,可以并列写多个replicate-do-db=db1replicate-do-db=db2…#不进行同步的表,可以并列写多个replicate-wild-ignore-table=db1.table1replicate-wild-ignore-table=db2.table2…#忽略复制的数据库,可以并列写多个replicate-ignore-db = mysqlreplicate-ignore-db = information_schemareplicate-ignore-db = performance_schema…#日志格式(Statement,Row,Mixedlevel)binlog_format = ROW#开启日志log-bin = mysql-bin#操作日志log-bin-index= mysql-bin.indexrelay-log = relay-logrelay_log_index= relay-log.index#GTID配置#是否开启GTID功能gtid_mode=onenforce_gtid_consistency=on#同步主库操作日志log-slave-updates = 1#跳过所有错误,这个参数至关重要,想要研究这个参数的作用,可以先不写,看看发生什么slave-skip-errors = all

第四步:修改完上述配置后需要重启mysql:service mysqld restart

第五步:把RDS的的数据迁移过来,只迁移自己需要的表就行了

迁移数据可以选择:mysqldump(具体怎么用自己查文档,自己查看每个参数的作用)下面是我的写法(--single-transaction 参数是防止锁表的):

mysqldump -u userName -p password -h url --single-transaction --master-data=2 -R --databases dbName>ksxing_datas.sql

这一步需要注意:先说一下主从同步的基本原理:把主库上面执行的DML操作的sql文件在从库上面执行一边,如果你的线上的数据库已经是一个运行好多年的数据库,可能日志文件只保存近几天的,所以需要把以前的数据迁移过来,如果主库是全新的,那就没有必要迁移了;

第六步:

①登录master,查看日志文件,命令是:show master status \G; File即为当前master的日志文件;

②登录slave执行下面的命令:

CHANGE MASTER TO MASTER_HOST='Master地址', MASTER_PORT=端口号, MASTER_USER='userName', MASTER_PASSWORD='password',MASTER_LOG_FILE='上面查到的file', MASTER_LOG_POS=0;//第一次同步时从MASTER_LOG_FILE文件中的什么位置开始,一般设为0就可以,

③slave中启动主从同步:start slave;

④查看同步的情况:show salve status |G;正常情况可以看到下面结果:

看到两个Yes,表示主从同步建立成功!恭喜你哦!

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

注意:如果上面这些操作顺利完成,并且同步成功,那么恭喜你,但是呢,结果往往不会那么顺利,可能会遇到各种各种的问题,下面我就说一下我遇到的几个问题吧,可以做一下参考:

问题1:查看从库状态(show salve status \G)时,有错误日志,这至少说明master-salve处于同步状态,但是在同步的过程中发生异常而已,不管什么异常吧,你都可以在配置文件f中配置:slave-skip-errors = all,跳过所有错误!这时,你肯定会有一个疑问,为什么不去解决错误而去跳过错误呢;其实正常情况下,可能发生错误的原因:要么表结构不一致,要么没有权限(通常不会控制单表的权限的),要么表的主键冲突;

解释一下为什么主键会冲突:假如你在某个时间里给A表里增加了1条数据,此时主键到了100,之后你做了数据迁移,把主键为100的数据也迁移过去了,但是新增这条数据的日志文件中也存在“增加主键为100的语句”,那么当你在启动主从同步的时候,执行到这条语句的时候就会发生主键已经存在的冲突,你只要跳过这个错误就行啦。数据不会影响。

问题2:数据量不一致,slave的数据量小于master;造成这个的原因是可能是:

①迁移数据与开启同步时间间隔时间比较久,假如一月一号你做的数据迁移,到了一月十号做的同步(时间可能有点夸张了),但是RDS只能保存有限份日志文件(一份log文件记录满了会重新创建一份新的),假如只保存9号和10的;那么2号到8号的数据即没有迁移过来,也没找到日志文件就会丢失。

②master数据量的增长比较快,当你使用show master status;查看日志文件的时候与迁移数据之间已经创建了很多日志文件,就回有一部分数据没有过来,这时候你就可以设置日志文件的时候这样做:假如查到master中FIle为:mysql-bin.0001528,你在slave设置MASTER_LOG_FILE时为:mysql-bin.0001527(或者可以更小),只要不发生文件找不到的异常就可以。这个时候可能发生问题1,所以体现了slave-skip-errors = all的重要性。

谢谢:码字不易,请尊重原创,转载请说明出处!

如果有任何问题请留言!

如果觉得对您有任何帮助,可以点击一下关注,以后会有更多的好文!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。