使用mysql_upgrade升级mysql5.1至5.6的数据库升级实施方案

2023-11-16

本方案是因为在工作中遇到的一个mysql主从功能配置的问题所引起的。有一个处在从位置上的mysql是5.1版本的,从5.1到5.6的mysql各种系统管理功能,像系统表表结构、日志文件格式等等均不一致。这时直接以5.1版本去作为一个5.6版本mysql的从时,会发现连binlog日志都解析失败了。于是评估各种利弊后,决定升级5.1的数据库版本至5.6.26 。
拿mysql5.1作为5.6的从时,报错如下:
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 1594
               Last_SQL_Error: Relay log read failure: Could not parse relay log event entry. The possible reasons are: the master's binary log is 
corrupted (you can check this by running 'mysqlbinlog' on the binary log), the slave's relay log is corrupted (you
 
这并不是一件轻松的事,尤其是需要升级的这个mysql5.1数据库还是一个线上运行且负载较重的业务数据库的时候。该数据库的数据目录中各种业务表加起来近500GB之大。
一、准备工作
1、在DB主机上编译安装mysql5.6
mysql5.6.26源码放在/usr/local/src下。
编译与安装:
cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql5.6 \
-DMYSQL_DATADIR=/data/mysql5.6 \
-DSYSCONFDIR=/etc/mysql5.6 \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_MEMORY_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITHOUT_FEDERATED_STORAGE_ENGINE=1 \
-DENABLE_DOWNLOADS=1 \
-DENABLED_LOCAL_INFILE=1 \
-DMYSQL_UNIX_ADDR=/var/lib/mysql/mysql5.6.sock \
-DMYSQL_TCP_PORT=4306 \
-DEXTRA_CHARSETS=all \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_SSL=yes \

make 
make install 
2、环境配置
chown -R mysql:mysql /usr/local/mysql5.6
chown -R mysql.mysql /data/mysql5.6

cd /usr/local/mysql5.6
cp ./my.cnf /etc/mysql5.6/my.cnf          --暂时将my.cnf中的端口改为4306,将sock文件都加上一个5.6的后缀,因为要和mysql5.1同时运行。
cp ./support-files/mysql.server /etc/rc.d/init.d/mysqld5.6     --暂时命名为mysqld5.6
3、初始化数据库
cd /usr/local/mysql5.6
./scripts/mysql_install_db --defaults-file=/etc/mysql5.6/my.cnf --basedir=/usr/local/mysql5.6 --datadir=/data/mysql5.6 --user=mysql
在4306端口上启动mysql5.6的数据库:
/etc/init.d/mysqld5.6  start
重置root密码:
mysqladmin --port=4306 --socket=/var/lib/mysql/mysql5.6.sock -uroot -hlocalhost password 'XXXXXXXXXXXX'

登录以验证服务可用性:
mysql --port=4306 --socket=/var/lib/mysql/mysql5.6.sock -uroot -p
以上步骤,在线上实施业务库升级前均要实施完成。
二、线上实施工作
1、切换线上业务至备用DB,停DB主机的mysql5.1的数据库
(1)备份数据库主机上5.1数据库中的"mysql"库
mysqldump -uroot -p --databases mysql > mysql.database.sql
备份该元数据库,以防后面升级失败时用于回撤。
(2)停db主机上原3306端口的5.1数据库
service mysqld stop
移走原mysql5.1使用的配置文件和服务启动脚本:
mkdir -p /data/backup/20161027
mv  /etc/my.cnf  /data/backup/20161027
mv /etc/init.d/mysqld  /data/backup/20161027
2、使用mysql_upgrade升级数据库5.6版本
这里采用的是 in place升级方式,主要特点是直接把原5.1数据库的数据目录交给新编译安装的mysql5.6使用,但这需要处理一些兼容性问题。
详细介绍参见以下链接:
(1)登录db 主机关闭5.1的数据库
service mysqld stop
如果5.6的库仍然在4306端口运行着,此时同样也要关闭。
/etc/init.d/mysqld5.6 stop
(2)修改/etc/my.cnf
注释掉table_cache = 1500 这一行参数,因为高版本的mysql会因不支持该参数而启动失败。
删除/etc/mysql5.6/my.cnf目录,该目录及配置文件是之前基于4306端口运行mysql5.6时所使用的。
(3)修改mysql服务管理脚本mysqld
mv  /etc/init.d/mysqld5.6  /etc/init.d/mysqld
vi  /etc/init.d/mysqld
首先将以下两行参数,第一行设为/etc/my.cnf,第二行直接把--defaults-file部分删除。
conf=/etc/mysql5.6/my.cnf
$bindir/mysqld_safe --defaults-file="/etc/mysql5.6/my.cnf" --datadir="$datadir"
在该文件中找到以下两个参数,设置如下,其中datadir直接复用原mysql5.1的数据目录:
basedir=/usr/local/mysql5.6
datadir=/data/mysql
找到以下段落,设置datadir为正确的值:
if test -z "$basedir"
then
  basedir=/usr/local/mysql5.6
  bindir=/usr/local/mysql5.6/bin
  if test -z "$datadir"
  then
    datadir=/data/mysql
  fi
  sbindir=/usr/local/mysql5.6/bin
  libexecdir=/usr/local/mysql5.6/bin
(4)启动mysql5.6
先清空之前的错误日志,便于观察:echo "" > /var/log/mysqld.log
启动数据库: /etc/init.d/mysqld  start
观察错误日志输出信息,会看到因为数据目录中不存在5.6版本的管理信息而产生的报错,但不会影响数据库启动。
(5)执行mysql_upgrade升级数据库版本
/usr/local/mysql5.6/bin/mysql_upgrade -u root -p

执行后会显示mysql对全部库表执行了一次检查和修复、升级,升级正常则不会有报错信息。
重启数据库以使上面的升级结果生效:
/etc/init.d/mysqld  stop
/etc/init.d/mysqld  start
按以下步骤检查:
  • 登录mysql检查下是否增加了一个performance_schema的库;
  • 进入名为mysql的库,检查是否新增了innodb_index_stats,innodb_table_stats,proxies_priv,slave_master_info,slave_relay_log_info,slave_worker_info 这6张表;
  • 检查mysql.user表,是否新增了Create_tablespace_priv,plugin,authentication_string,password_expired这4个字段;
  • 检查业务上使用的数据库表、数据是否正常;
  • 再观察mysql的错误日志输出信息;
mysql_upgrade命令做了些什么工作
mysql_upgrade examines all tables in all databases for incompatibilities with the current version of MySQL.
mysql_upgrade also upgrades the mysql system database so that you can take advantage of new privileges or capabilities.
(6)配置环境变量
编辑/etc/profile文件,在PATH变量中增加以下信息:
PATH=/usr/local/mysql5.6/bin:$PATH
export PATH
source /etc/profile
运行mysql -V看显示的版本信息是不是5.6 。登录下数据库看是否正常。
至此,版本升级工作全部结束。
业务应用在使用升级后的数据库时,未发现存在读写或其它问题。
基于新升级后的数据库,成功得配置了与mysql master的主从复制关系。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用mysql_upgrade升级mysql5.1至5.6的数据库升级实施方案 的相关文章

  • 通过左连接实现精确分页

    我已经思考这个问题有一段时间了 我认为最好四处询问并听听其他人的想法 我正在构建一个在 Mysql 上存储位置的系统 每个位置都有一个类型 有些位置有多个地址 表格看起来像这样 location location id autoincrem
  • Hibernate、MySQL 视图和 hibernate.hbm2ddl.auto = 验证

    我可以在 Hibernate 中使用 MySQL 视图 将它们视为表 即 该实体与为表创建的实体没有什么不同 但是 当 Hibernate 设置为验证模型时 我的应用程序将不会部署 因为它找不到视图 因为它假设它是一个表 是否可以在启用部署
  • MySQL更改表,添加具有唯一随机值的列

    我有一个表 我添加了一个名为phone 该表还有一个 id 设置为自动增量的主键 如何将随机值插入到电话列中 该值不会重复 以下 UPDATE 语句确实插入了随机值 但并非所有值都是唯一的 另外 我没有被卖掉 我投了phone字段也正确 但
  • 如何解决 MySQL Workbench 上的这些行错误?

    正如您所看到的 我的代码中没有语法错误或类似的错误 你们能帮我吗 我想这只是错误标记机制中的一个小错误 尝试编辑代码或关闭此编辑器并打开一个新编辑器 如果您有重现此问题的步骤列表 您甚至可以创建一个错误报告 http bugs mysql
  • 提高mysql导入速度[关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 我有一个很大的数据库22GB 我曾经用过进行备份mysqldumpgzip 格式的命令 当我提取 gz 文件时 它会生成 sql文件的
  • 在数据库中存储差异的最紧凑方式是什么?

    我想实现类似于维基媒体的修订历史的东西 最好使用的 PHP 函数 库 扩展 算法是什么 我希望差异尽可能紧凑 但我很高兴只能显示每个修订版与其同级修订版之间的差异 并且一次只能回滚一个修订版 在某些情况下 只有几个字符可能会发生变化 而在其
  • MAMP Python-MySQLdb 问题:调用 Python 文件后 libssl.1.0.0.dylib 的路径发生变化

    我正在尝试使用 python MySQLdb 访问 MAMP 服务器上的 MySQL 数据库 当我最初尝试使用 python sql 调用 Python 文件来访问 MAMP 上的数据库时 我得到了image not found关于错误li
  • REPLACE MYSql 中的新行字符不起作用

    我执行了以下查询 由于某种原因它没有替换数据库中的换行符 它说 Rows matches 1 但没有变化 有什么问题吗 mysql gt UPDATE aboutme SET abouttext REPLACE abouttext n WH
  • mysql查询先慢后快

    我有 2 个 myISAM 表 分别称为 tests 和 completed tests 一个有 170 个条目 另一个有 118k 条目 当我运行此查询时 SELECT ct archive ct status ct score ct u
  • 哈希 MySQL 数据库架构

    我想对 MySQL 数据库模式 没有数据 进行哈希 签名 以便对其进行校验和 以确保它不被其他人修改 我怎样才能实现它 据我了解您的问题 您需要表校验和 checksum table table 所以 我想 只需对空表进行校验和
  • mysql 使用什么样的哈希?

    我正在编写类似于 phpMyAdmin 的自己的代码 但我需要用户能够使用 mysql 数据库中的用户名和密码登录 我需要知道mysql数据库使用什么样的哈希来存储每个用户的密码 我检查了 dev mysql com 寻找答案 但除了以 开
  • IMAP 和 PHP - 从已发送文件夹和收件箱文件夹中获取所有电子邮件

    我正在尝试获取接收和发送的所有电子邮件 并使用 PHP 将其写入 mySQL 数据库 我使用的主机名是 hostname imap gmail com 993 imap ssl INBOX 它仅引用收件箱 并成功抓取收到的电子邮件 为了抓取
  • mysql 中 INSERT 语句的计算列

    假设我想要一个表来记录其他表中的日期和列数 或者任何类型的数学 字符串连接等 CREATE TABLE log id INTEGER NOT NULL AUTO INCREMENT date DATETIME NOT NULL count
  • MyBatis 枚举的使用

    我知道以前有人问过这个问题 但我无法根据迄今为止找到的信息实施解决方案 所以也许有人可以向我解释一下 我有一个表 状态 它有两列 id 和 name id是PK 我不想使用 POJO Status 而是使用枚举 我创建了这样一个枚举 如下所
  • Wordnet sqlite 同义词和示例

    我正在尝试获取给定 wordid 的同义词和示例列表 经过大量的试验和错误 我可以获得所有同义词集的样本 但不是实际的同义词 这是我的查询 它给出了以下结果 select senses wordid senses synsetid sens
  • 日常 MySQL(部分和过滤)复制的最佳实践?

    我有一个相当大的数据库 有超过 40 个表 我只需要复制几个表 5 并且每个表也被过滤 我正在寻找一些复制这些数据的最佳实践 每天就足够了 我可以只选择几个表并为每个表包含一些 WHERE 子句 我正在考虑为每个表启动 mysqldump
  • 如何查找所有mysql表之间的所有关系?

    如何找到MySQL所有表之间的所有关系 例如 如果我想知道大约有 100 个表的数据库中表的关系 有什么办法知道这个吗 从编程角度来说 更好的方法是从以下位置收集数据 INFORMATION SCHEMA KEY COLUMN USAGE表
  • 软删除最佳实践(PHP/MySQL)

    Problem 在处理产品和订单的 Web 应用程序中 我想维护前员工 用户 与他们处理的订单之间的信息和关系 我想维护过时产品和包含这些产品的订单之间的信息和关系 然而 我希望员工能够整理管理界面 例如删除前员工 过时的产品 过时的产品组
  • 如何限制两个表之间一对多关系中的多个数量?

    我有一个带有两个 MySql 表的 MySQL 数据库 第一个是第一个表 表 A 有一列具有唯一值 从值 从 1 到 n 在第二个表 2 表 B 中 我有两列 在第一个表中我有一个名称 在第二个我的值从 1 到 n 如果我在 中添加一个值
  • MySQL如何从多个表中获取数据

    我正在寻找 php MySQL jquery 的帮助 我有2张桌子 table1表 1 有 4 列 id 标题 desc thumb img tabel2表 2 有 3 列 id 表 id img 我只想将 2 个表与 get QS 的值进

随机推荐

  • GBDT调库代码示例

    二 使用GBDT预测新能源汽车充电桩的故障检测问题 55分 请你用训练数据构建相应的模型 并将模型进行保存 import matplotlib pyplot as plt 正常显示中文及字符 plt rcParams font family
  • python中返回上一步操作_通过实例解析Python文件操作实现步骤

    当程序运行时 变量是保存数据的好方法 但变量 序列以及对象中存储的数据是暂时的 程序结束后就会丢失 如果希望程序结束后数据仍然保持 就需要将数据保存到文件中 Python 提供了内置的文件对象 以及对文件 目录进行操作的内置模块 通过这些技
  • Nginx启动只有master进程而没有worker进程

    大致按照下面文章的提示进行排查 https blog csdn net sinat 37729104 article details 102662475 https blog csdn net qt10086 article details
  • docker配置java环境和mysql数据库

    1 安装docker 1 安装命令 yum install docker 有提示直接y确认 2 设置开机自动启动 service docker start 3 查看版本 docker version 4 修改docker仓库地址 命令 vi
  • stm32定时器时钟源时钟选择,重点是外部时钟源1模式的理解

    stm32定时器时钟源时钟选择 stm32定时器时钟源时钟选择 有意义的参考 TI与ITRX的区别参考 https blog csdn net gtkknd article details 39292517 解析参考 https blog
  • Jenkins持续集成-实现自动向gitlab拉取代码并构建

    Jenkins服务操作 1 选择系统管理 gt 插件管理 gt 可选插件 gt 下载 gitlab 插件 2 选择新建任务 gt 构建 一个自由项目 2 填写相应的gitlab仓库地址和密钥信息 3 在 构建触发器 gt 选择 Buil w
  • [Java] 方法签名(method signature)

    方法头指定修饰符 例如static 返回值类型 方法名 和形式参数 方法头中定义的变量称为形参 形式参数 formal parameter 或 parameter 形参如同占位符 当方法被调用时 传递一个值给形参 此值称为实参 实际参数 a
  • python使用 pyinstaller -F -w file报PermissionError问题

    python使用 pyinstaller F w file报PermissionError问题 根据自己的情况 该报错重新安装pyinstaller 或者重启一下pycharm可以解决一次该问题 但是如果第二次打包就会报该问题 但是 经过验
  • 排序算法——比较类排序算法讲解以及c++实现

    首先我先抛一个老哥的博客 我是看着他的博客来学习理解 地址 https www cnblogs com onepixel p 7674659 html 首先说一下排序算法分为2类 一类是比较类排序算法 另一类是非比较类排序 这里主要讲常用的
  • 如何用数字化系统延长用户运营周期?如何建立数字化用户体系?

    如果说运营是进行用户引流 留存及转化的各个细分环节搭建 精细化运营便是针对各个细分环节 结合用户画像 人群定位 场景拆解及数据分析等细节 对用户展开有针对性的运营策略 要知道 运营需要以用户为中心 没有用户也就意味着没有收益 想要以用户为中
  • Java数字字符串的判断与转换

    文章目录 引言 一 判断字符串是否为数字 1 1 第三方包StringUtils isNumeric 1 2 Java自带方法Character isDigit 1 3 正则表达式 二 将字符串转化为数字 2 1 整数 2 2 小数 参考
  • PostgreSQL基础+部署

    什么是postgreSQL PostgreSQL是一个功能强大的开源对象关系型数据库系统 他使用和扩展了SQL语言 并结合了许多安全存储和扩展最复杂数据工作负载的功能 PostgreSQL的起源可以追溯到1986年 作为加州大学伯克利分校P
  • Gin 框架学习

    Gin 框架
  • python 异步共享变量问题记录

    draw boxes multiprocessing Manager list item name image name replace jpg logging info Working on format item name pool m
  • 计组——搞懂主存储器芯片之地址线数据线及片选线和读写控制线

    一块存储芯片完整的构造图如下 内部进行了封装 存储矩阵是由一个一个的存储元构成 译码驱动电路分为译码器和驱动器 译码器会输出某一条线路的高电平信号 驱动器是为了保证译码器输出的高电平稳定可靠的 可以理解为将电信号放大的部件 读写电路是连通存
  • 【DL with Pytorch】第 3 章 :使用 DNN 的分类问题

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • Python:使用os模块执行cmd命令

    大家好 我是wangzirui32 今天我们来学习如何让Python执行cmd命令 很简单 输入代码 from os import system 在system里放入需要执行的命令即可 这里我写的是ipconfig命令 ok system
  • NSI50150ADT4G TO-252 ON安森美 150-350mA 50V 4.2W LED驱动器 工业级规格认证

    NSI50150ADT4G TO 252 ON安森美 150 350mA 50V 4 2W LED驱动器 工业级规格认证 是一款可调恒流调节器 CCR 是一种简单的 高性能低成本产品 适用于为 LED 中的调节电流提供成本高效的方案 C该
  • XGBoost实战1:boston房价预测

    boston房价数据集包括506个样本 每个样本包括13个特征变量和该地区的平均房价 房价显然和多个特征变量相关 对于XGBoost模型 我们分别用两种方式来创建 本章学习以下内容 1 XGBoost两种方式建模以及所需参数 2 gridS
  • 使用mysql_upgrade升级mysql5.1至5.6的数据库升级实施方案

    本方案是因为在工作中遇到的一个mysql主从功能配置的问题所引起的 有一个处在从位置上的mysql是5 1版本的 从5 1到5 6的mysql各种系统管理功能 像系统表表结构 日志文件格式等等均不一致 这时直接以5 1版本去作为一个5 6版