【Golang+MySQL】记一次 MySQL 数据库迁移(一)

【Golang+mysql】记一次mysql数据库迁移(一)

文章地址: https://github.com/stayfoo/stayfoo-hub

一、准备

  • 目标:

腾讯云 CVM 自建 mysql 数据迁移到腾讯云数据库 mysql

  • 腾讯云 CVM 自建 mysql 现状:

    • 1、mysql 版本:Ver 8.0.15 for Linux on x86_64 (MySQL Community Server - GPL)

    • 2、mysql 文件目录数据大小: 2.4 G (/var/lib/mysql)

      • 查看 msyql 数据目录位置:mysql> show variables like '%datadir%';
      • 查看 /var/lib/mysql 目录的大小: du -sh
      mysql> show variables like '%datadir%';
      +---------------+-----------------+
      | Variable_name | Value           |
      +---------------+-----------------+
      | datadir       | /var/lib/mysql/ |
      +---------------+-----------------+
      1 row in set (0.04 sec)
    • 3、只有一个 root 账户,只允许 localhost 访问

    • 4、数据库字符集:charset=utf8

  • 起因:

    api 服务、报表计划任务、以及其他计划任务、自建 mysql 都在同一台腾讯 CVM 上面。计划任务执行的时候,mysql 占用 CPU 过高,会导致 api 服务无法正常使用。所以考虑腾讯云数据库 mysql,使用主从架构(先尝试使用一主一从),master mysql 主要服务于 api 服务,slave mysql 主要用于计划任务。

  • 腾讯云数据库 mysql

    • 1、腾讯云数据库 mysql 与腾讯云服务器 CVM,同一账号下,同一个地域支持使用内网 ip 访问。(比如 CVM 是重庆,云数据库必须也是重庆,并且是在同一账号下)

    • 2、购买腾讯云 mysql 5.7(支持的最大版本,没有8.0):先购买一台高可用版 mysql,作为 master mysql,之后可以扩展多台 slave mysql

    • 3、迁移工具:腾讯云DTSmysqldump(备用)

二、迁移

  • 1、使用 DTS 迁移

购买完云 mysql,初始化,开始使用 DTS 进行迁移。 自建 mysql 和 云 mysql 是属于同一个账号下,同一区域下,可以使用内网直接访问。

image

  • 2、查看 CVM 自建 mysql 用户
mysql> select host,user,plugin from user;

发现只有一个 root 账号,只能 localhost 访问,需要创建新账号,指定购买的云 mysql 的内网 ip 授权访问的新账号。在 CVM 自建 mysql 创建账号:

mysql> GRANT ALL PRIVILEGES ON *.* TO "stay"@"1xx.xx.0.0" IDENTIFIED BY "111";

创建账号,并授权,发现报错。提示不能用 grant 创建用户。 原来 mysql8.0 以前的版本可以使用 grant 在授权的时候隐式的创建用户。mysql8.0 以后已经不支持。mysql8.0 必须先创建用户,然后再授权,命令如下:

mysql> CREATE USER 'stay'@'172.30.0.0' IDENTIFIED BY '密码';
Query OK, 0 rows affected (0.48 sec)

mysql> grant all privileges on *.* TO 'stay'@'172.30.0.0';
Query OK, 0 rows affected (0.48 sec)

注意:密码不能和 root 账户相同。

参考 mysql8.0 文档:https://dev.mysql.com/doc/refman/8.0/en/pr...

  • 3、在腾讯云 mysql 操作 DTS

输入源库设置,接入类型选择云主机自建,选择自建 mysql 所在的主机实例ID,所属区域,自建 mysql 的端口号,输入新建的账号,密码。

配置完成之后,测试连通性,Telnet 通过,MySQL Connect 失败。提示:MySQL Connect无法连接源实例。请检查实例账号、密码,并确认源实例是否取消对[172.30.0.0/20]的访问限制 如图:

image

创建账号的时候,对[172.30.0.0/20]的访问是授权的。

尝试设置 CVM 服务器安全组,把 172.30.0.0(即云mysql内网 ip)设置为信任访问 3306 端口。测试连接依然不行。

尝试新创建了一个对所有ip都能访问授权的账号,并测试在本地电脑远程连接自建 mysql 是没有问题的。然后把这个账号密码配置到 DTS 源库上,测试连通性,依然不行。

给腾讯云 mysql 提了工单,让腾讯云工程师协助解决。工单:

image

源库连接失败原因:

知道是因为版本问题导致的,自建 mysql8.0.15,而腾讯云 mysql 最高支持 5.7DTS 不支持从 8.0.15 迁移到 5.7,所以连通性测试会一直失败。

  • 4、使用 mysqldump 手动迁移数据

mysqldump 工作原理:查出需要备份的表结构 -> 生成一个 create sql语句(sql后缀名的文本文件);表中所有记录 -> 转成一条 insert 语句。

先从源数据库导出数据库表结构信息:

# 导出数据库表结构(导出的是创建表结构的sql语句)
mysqldump --opt -d[库名] -u[数据库用户名] -p[密码] > /导出的文件名字存储路径.sql

从源数据库导出数据信息:

mysqldump -t[数据库名] -u[数据库用户名] -p[数据库密码] > xxx.sql

CVM 主机上使用内网 ip 链接云 mysql,先创建同名数据库:

mysql> create DATABASE sf_factory charset=utf8;

然后,依次导入数据库表结构信息,数据库数据:

mysql> source [导出的数据库表结构.sql];
mysql> source [导出的数据库数据.sql];

参考 msyql 8.0官方文档:https://dev.mysql.com/doc/refman/8.0/en/my...

  • 5、验证数据完整性

  • 6、删除自建 mysql 多余账号信息

mysql> drop user stay@"172.30.0.0/20";

方式一:drop 不仅会将 user 表中的数据删除,还会删除对应权限表内容。

#drop user xxxx; 默认删除的是 'xxxx'@'%'
drop user xxxx;

drop user 'xxxx'@'localhost';
drop user 'xxxx'@'172.xx.x.x';

方式二:delete 只会删除 user 中的内容。所以使用 delete 删除用户后需要执行 FLUSH PRIVILEGES;刷新权限,否则下次使用 create 创建用户会报错。

Image placeholder
chengjiabing
未设置
  29人点赞

没有讨论,发表一下自己的看法吧

推荐文章
GORM 中文文档_4.4. 数据库迁移

自动迁移 使用migrate来维持你的表结构一直处于最新状态。 警告:migrate仅支持创建表,没有的字段和没有索引。为了保护你的数据,它并不支持改变已有的字段类型或删除未被使用的字段 db.Aut

学习 nodejs+mongodb+koa2 写接口(一) 环境布置

一.环境准备最近在学用Nodejs写后端接口,了解到koa2是Nodejs的一个框架。可以快速开发后端接口,同时也能更快熟悉Nodejs以下是所需的环境node  v7.6+,可以用nvm或者n安装指

Oracle/云MySQL/MsSQL“大迁移”真相及最优方案

最近一段时间碰到一些数据迁移的项目,如:Oracle迁移到MySQL,MsSQL迁移到MySQL,云MySQL迁移到本地MySQL。对于这方面做了系统的整理。包括:迁移方案的选择、如何跳出迁移遇到的坑

MySQL 数据库操作:创建和查看数据库

数据库是数据的集合。MySQL允许我们高效地存储和检索数据库中的数据。在MySQL中,我们可以使用CREATEDATABASE语句创建数据库。但是,如果数据库已经存在,则会引发错误。为了避免该错误,我

MySQL 数据库操作:删除数据库

使用MySQL的DROPDATABASE命令可以很容易的删除一个数据库。数据库删除的同时,所属的数据表将一起被删除。如果删除的数据库不存在,则会引发错误。为了避免错误的发生,可以在DROPDATABA

phpstrom 快捷键,老是记不住哇! 记一下记一下!

老是记不住哇!记一下记一下! Esc键编辑器(从工具窗口)F2(Shift+F2)下/上高亮错误或警告快速定位F3向下查找关键字出现位置F4查找变量来源F5复制文件/文件夹F6移动F11切换书签F12

从MySQL到POLARDB, 三位CTO讲述迁移背后的故事!

摘要: 去年9月21日,阿里云发布了自主研发的通用云数据库POLARDB公测版,今年4月,POLARDB正式商业化。此前,POLARDB核心卖点是100%向下兼容MySQL5.6,100TB存储容量,

ThinkPHP6 核心分析(一):Http 类的实例化

从入口文件出发 当访问一个ThinkPHP搭建的站点,框架最先是从入口文件开始的,然后才是应用初始化、路由解析、控制器调用和响应输出等操作。入口文件主要代码如下: //引入自动加载器,实现类的自动加载

通过 Laravel 创建一个 Vue 单页面应用(一)

使用laravel创建一个Vue单页面应用(SPA)可以构建一个整洁的由API驱动的应用。在此教程中,我们将学习如何构建并运行一个以Vue路由为前端,laravel为后端的SPA应用。首先我们将注意

【小程序】小程序学习遇到的问题汇总(一)

之前在学习小程序的过程中碰见了不少问题,在这里汇总记录一下,本篇为第一篇。1.小程序中切换tab传值/通信问题这是切换tab遇见的问题,应用情景:每次点击某一tab时传入设定值。由于小程序每一个页面都

欧洲最大MySQL用户之一,Booking.com数据库构架探秘!

吴鑫Booking.com数据库工程师TeamLead2015年加入总部位于阿姆斯特丹的Booking.com数据团队,现任数据库工程师团队负责人,主要是负责Booking.com里MySQL相关的运

MySQL 亿级数据数据库优化方案测试-银行交易流水记录的查询

作者:逸宸a链接:https://www.jianshu.com/p/cbdef47fb837对MySQL的性能和亿级数据的处理方法思考,以及分库分表到底该如何做,在什么场景比较合适?比如银行交易流水

记一次 vue 的异步更新队列导致内存泄漏

起因 由于项目是需要连续传输图片形成一个伪视频(没办法,客户钱给的不够)来观看。后端采用传输base64的图片到前端展示。 环境 php:7.2 workerman:3.X vue:2.X 过程 wo

记一次JVM FullGC引发严重线上事故的定位、分析、解决过程!

这篇文章给大家聊一次线上生产系统事故的解决经历,其背后代表的是线上生产系统的JVMFullGC可能引发的严重故障。一、业务场景介绍先简单说说线上生产系统的一个背景,因为仅仅是文章作为案例来讲,所以弱化

HBase实战:记一次Safepoint导致长时间STW的踩坑之旅

本文记录了HBase中Safepoint导致长时间STW此问题的解决思路及办法。过程记录现象:小米有一个比较大的公共离线HBase集群,用户很多,每天有大量的MapReduce或Spark离线分析任务

记一次隐藏很深的 JVM 线上惨案的分析、排查、解决!

1、本文背景本文会给大家讲解一个比较特殊的JVM优化案例,这个优化案例本身是因为新手工程师对JVM优化可能了解了一个半吊子,然后不知道从哪里找来了一个非常特殊的JVM参数错误的设置了一下,就导致线上系

2019年8月数据库流行度排行:双星闪耀 MySQL 成月度最大赢家

炎炎夏日,DB-Engines的8月榜单已经发布,本月积分MySQL获得了最显著的增长,较上月增加了24分,Oracle获得了18分的增长,Oracle公司的两个王牌产品,闪耀8月。以下是前10名的榜

2019年9月数据库流行度排行:MySQL 强劲增长完成深 V 反转

导读:DB-Engines的2019年9月数据库流行度排行榜已经发布,本月最耀眼的明星是MySQL,分值大幅增长25.39分,较年初已经上升了125分,增幅达10%,完成了一次深V反转。相较之下,Or

面试官问:请介绍一下MySQL数据库的锁机制?

为什么要加锁问题背景当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。要解决的问题多用户环境下保证数

工商银行MySQL数据库架构解密

本文根据DTCC数据库大会分享内容整理而成,将介绍工行IT架构转型中传统OLTP数据库架构面临的挑战和诉求,构建基于MySQL分布式企业级解决方案实践历程,包括技术选择、高可用设计、两地三中心容灾、运

SQL Server 2014的数据库引擎新增功能(参考sqlserver官方文档)

SQLServer2014数据库引擎引入了一些新功能和增强功能,这些功能可以提高设计、开发和维护数据存储系统的架构师、开发人员和管理员的能力和工作效率。  以下是 数据库引擎已增强的方面。数据库引擎功

MySQL 性能优化:8 种常见 SQL 错误用法!

1、LIMIT语句分页查询是最常用的场景之一,但也通常也是最容易出问题的地方。比如对于下面简单的语句,一般DBA想到的办法是在type,name,create_time字段上加组合索引。这样条件排序都

一条SQL语句在MySQL中如何执行的

前两天发了一条SQL慢的原因有哪些,在那篇文章我没有说到优化器之类的,我觉得如果配合一条SQL是如何执行的,会更好,所以特地找了一篇。来源:JavaGuide  |作者:木木匠本篇文章会分析一个sql

mysql 进行update时,要更新的字段中有单引号或者双引号导致不能批量生成sql的问题

前言将数据从一张表迁移到另外一张表的过程中,通过mysql的concat方法批量生成sql时遇到了一个问题,即进行UPDATE更新操作时如果原表中的字段中包含单引号'或者双引号",那么就会生成不正确的

【Git入门234】Git本地仓库常用操作流程2_分支相关操作_大总结

创建分支gitbranchgitbranchx 仅创建一个叫x的分支拷贝,不对代码进行任何变动 可以创造平行时间线x 术语叫“分支” 虚拷贝,引用 可以同时基于master/branchx开发