没事千万别动生产服数据库 - 来自小菜鸟的忠告

news2024/11/24 9:49:49

common-issues-mysql-thumb

阿里云官方参考文档


目录

    • 背景
    • 一、环境部署
    • 二、目录规划
    • 三、操作步骤
    • FAQ


背景

今天把一张 5500 多万条记录的表进行按年度拆分,本来打算将表数据拆分为 2020 年、2021 年、2022 年三张新表,提升原表查询效率,仅保留 2023 年数据。表拆分完毕后,就陆续删除原表中 2020 年、2021 年、2022 年的数据。结果在执行 SQL 过程中误操作执行了删除 2023 年全年的 SQL 语句,具体如下:

delete from kys_convert_order where add_time between '2022-11-01 00:00:01' and '2023-12-01 00:00:00';

原本是需要执行这条 SQL 语句的:

delete from kys_convert_order where add_time between '2022-11-01 00:00:01' and '2022-12-01 00:00:00';

发现不对劲后,赶紧 kill 掉 SQL 进程。但庆幸数据没有被删除,我初步猜测是因为 '2022-11-01 00:00:01' and '2023-12-01 00:00:00' 这段时间的数据量很大,SQL 进程可能在做扫表的一个操作。

为了验证数据是否被删除,于是将备份数据 dump 下来(我们使用的是阿里云的 RDS MySQL),备份方式为物理备份,最新备份数据为每天早上 8:00(即备份 策略为一天一次全量备份,共保留 7 天数据)。因此新开了一台按量付费的 Linux 实例,安装好 MySQL 环境,并进行数据恢复,验证与生产环境数据的一致性。以下是恢复详细步骤。

一、环境部署

1、MySQL

与 RDS MySQL 版本保持一致(大版本)

# rds MySQL 版本:5.7
# 本次安装 MySQL 版本:5.7.34

# 安装 MySQL 5.7 和 MySQL 官方的 Yum 源管理器
yum -y install https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm

# 安装 MySQL 5.7
yum -y install mysql-community-server

# 启动 MySQL
systemctl start mysqld

# 获取初始密码
grep password /var/log/mysqld.log

# 修改初始密码
mysqladmin -u root -p'旧密码' password '新密码'

# MySQL登录验证
mysql -u root -p'新密码'

2、qpress

解压工具

# 下载可执行文件的tar包
wget "https://static-aliyun-doc.oss-cn-hangzhou.aliyuncs.com/file-manage-files/zh-CN/20230406/flxd/qpress-11-linux-x64.tar"

# 解压下载的tar包,取出可执行文件
tar -xvf qpress-11-linux-x64.tar

# 设置qpress文件的执行权限
sudo chmod 775 qpress

# 拷贝qpress到/usr/bin中
sudo cp qpress /usr/bin

3、Percona XtraBackup

备份/恢复工具

# wget如果下载很慢,你可以先下载到你Windows本地再上传
wget https://downloads.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.28/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.28-1.el7.x86_64.rpm

# 开始安装XtraBackup
sudo yum localinstall -y percona-xtrabackup-24-2.4.28-1.el7.x86_64.rpm

二、目录规划

1、解压目录

用于存放解压后的备份文件(压缩文件从 RDS MySQL 下载并上传到服务器)

mkdir /var/mysql_bkdata
chown -R $USER:$USER /var/mysql_bkdata

2、数据目录

用于将备份文件恢复到此目录,启动自建数据库时,自建数据库的数据目录使用此目录的数据。

mkdir /var/mysql_newdata
chown -R $USER:$USER /var/mysql_newdata

三、操作步骤

1、下载备份文件

通过阿里云 RDS 控制台下载即可,过程略。可通过 wget 下载,下载的文件后缀有一定要求,否则无法解压,具体看官方说明:
image-20230606175552896

2、解压备份文件

qpress -do  test_xb.qp | xbstream -x -v -C /var/mysql_bkdata/

实测了一下,我在自建 MySQL 主机上 wget 了备份文件,且后缀名为 ddz_xb.qp,符合后缀名命名要求,但是通过上面这条命令是执行失败的,但你可以将 ddz_xb.qp 重命名为 ddz_qp.xb,然后使用上图 xbstream 的方式来解压是完全没问题的。

mv ddz_xb.qp ddz_qp.xb

开始解压文件:

# 步骤一:解包
cat ddz_qp.xb | xbstream -x -v -C /var/mysql_bkdata/

# 步骤二:解压(时间较长,需耐心等待)
# 适用于MySQL 5.5/5.6/5.7
innobackupex --decompress --remove-original /var/mysql_bkdata/

3、恢复数据

恢复数据库前,请先停止自建数据库服务。

  • 停止自建 MySQL 服务

    systemctl stop mysqld.service
    
  • 恢复前准备

    innobackupex --defaults-file=/var/mysql_bkdata/backup-my.cnf --apply-log /var/mysql_bkdata/
    

    参数解释

    参数含义
    –defaults-file通过传入配置文件设置MySQL默认选项。RDS MySQL备份文件中,提供名为backup-my.cnf的配置文件,该文件位于备份解压目录,即/var/mysql_bkdata/
    –apply-logXtraBackup工具的准备命令。该命令后配置存放备份文件的目录,即备份解压目录/var/mysql_bkdata/
  • 恢复数据

    innobackupex --defaults-file=/etc/my.cnf --copy-back /var/mysql_bkdata/
    

    参数解释

    参数含义
    –defaults-file自建数据库的my.cnf文件,根据此配置文件中设置的数据目录(datadir),获取恢复数据的目标路径。
    –copy-backXtraBackup工具的恢复命令。该命令后配置存放备份文件的目录,即备份解压目录/var/mysql_bkdata/,XtraBackup工具将此目录数据恢复到自建数据库的数据目录中。
  • 修改自建数据库配置文件my.cnf

    vim /etc/my.cnf
    
    ...
    # 指定新的数据目录
    datadir = /var/mysql_newdata
    # 参数innodb_undo_tablespaces的取值需要与/var/mysql_bkdata/backup-my.cnf中的取值相同
    # 可以使用cat /var/mysql_bkdata/backup-my.cnf | grep innodb_undo_tablespaces查询。
    innodb_undo_tablespaces=2
    innodb_undo_directory=/var/mysql_newdata
    
    # 在RDS MySQL管理控制台中查看实例参数lower_case_table_names的取值,如果取值为1,则需要修改自建数据库配置文件my.cnf。
    lower_case_table_names=1
    ...
    

4、启动自建 MySQL

  • 为新的数据目录授权

    chown -R mysql:mysql /var/mysql_newdata
    
  • 启动 MySQL 进程

    systemctl stop mysqld.service
    systemctl status mysqld.service
    

5、连接数据库并验证

  • 登录自建数据库

    mysql -uroot -p<对应密码>
    
  • 验证数据库是否完整

    show databases;
    

FAQ

在删除数据库表数据时,需要注意这几点:

(1)使用 DELETE 命令和 WHERE 子句来选择指定时间段内的数据。例如,假设需要删除时间范围为 start_time 和 end_time 之间的数据,则可以使用如下命令:

DELETE FROM kys_convert_order WHERE add_time BETWEEN '2022-01-01 00:00:00' AND '2022-03-01 00:00:00';

其中,table_name 是要删除数据的表名,time_column 是表中用于表示时间的列名,BETWEEN start_time AND end_time 是时间范围条件。

(2)使用 ORDER BY 子句按照时间升序(ASC)排序。例如,假设 time_column 是日期类型,则可以使用如下命令:

DELETE FROM kys_convert_order WHERE add_time BETWEEN '2022-01-01 00:00:00' AND '2022-03-01 00:00:00' ORDER BY add_time ASC;

这样就会按照时间顺序执行删除操作,从而确保数据是按照时间顺序删除的。

需要注意的是,如果表中数据比较多,一次性删除可能会导致性能问题,可以考虑使用 LIMIT 限制每次删除的行数。例如,可以使用如下命令:

DELETE FROM kys_convert_order WHERE add_time BETWEEN '2022-01-01 00:00:00' AND '2022-03-01 00:00:00' ORDER BY add_time ASC LIMIT 50000;

这里的 LIMIT 1000 表示每次最多删除 1000 行数据。需要多次执行命令,直到删除完所有指定时间段内的数据为止。

最后开发人员进行数据可用性校验!

—END

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/616956.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【SpinalHDL快速入门】4.1、基本类型之Bool

Tips1&#xff1a; 由于SpinalHDL是基于Scala构建的&#xff0c;Scala本身自带类似变量Boolean&#xff0c;故在此要认准SpinalHDL中采用的是Bool而非Boolean&#xff1a; Bool&#xff08;大写的True和False&#xff09;&#xff1a;True表示1&#xff0c;False表示0Boolean&…

Vue3搭建

Vue3项目搭建全过程 vue create 项目名 选择手动吗&#xff0c;自定义安装 选择vue3 是否选择class风格组件 选择ts处理工具和css预处理器 Y 是否使用router的history模式 Y 选择css预处理语言 ;less 9.选择lint的检查规范 只使用EsLint官网推荐规范 使用EsLint官网推荐规…

MyBatis-plus(1)

基本概念: 一)开发效率也就是我们使用这款框架开发的速度快不快&#xff0c;是否简单好用易上手。从这个角度思考&#xff0c;每当我们需要编写一个SQL需求的时候&#xff0c;我们需要做几步 1)Mapper接口提供一个抽象方法 2)Mapper接口对应的映射配置文件提供对应的标签和SQL语…

论文笔记--LLaMA: Open and Efficient Foundation Language Models

论文笔记--LLaMA: Open and Efficient Foundation Language Models 1. 文章简介2. 文章概括3 文章重点技术3.1 数据集3.2 模型训练 4. 数值实验5. 文章亮点6. 原文传送门7. References 1. 文章简介 标题&#xff1a;LLaMA: Open and Efficient Foundation Language Models作者…

【自动化测试】--JUnit5

前言 小亭子正在努力的学习编程&#xff0c;接下来将开启软件测试的学习~~ 分享的文章都是学习的笔记和感悟&#xff0c;如有不妥之处希望大佬们批评指正~~ 同时如果本文对你有帮助的话&#xff0c;烦请点赞关注支持一波, 感激不尽~~ 目录 前言 Junit5简介 什么是Junit5 JU…

tomcat和undertow、jetty、netty的区别

记录一下&#xff0c;最近发现的几个容器的区别 tomcat简介 Tomcat&#xff1a;免费开源&#xff0c;轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发和调试JSP 程序的首选。实际上Tomcat 部分是Apache 服务器的扩展&am…

十年历程:下定决心转向自动化测试/开发

目录 前言&#xff1a; 十年测试心路历程&#xff1a; 放弃了年薪二十万的offer&#xff0c;挑战自动化测试&#xff1a; 自动化测试心得&#xff1a; 自动化测试没用的误解&#xff1f; 关于测试开发 测试行业的现状 那么如何来全面的学习自动化测试呢&#xff1f; 前言&…

4.2 synchronized 解决方案

4.2 synchronized 解决方案 1、应用之互斥2、synchronized3、思考4、面向对象改进 1、应用之互斥 为了避免临界区的竞态条件发生&#xff0c;有多种手段可以达到目的。 阻塞式的解决方案&#xff1a;synchronized&#xff0c;Lock非阻塞式的解决方案&#xff1a;原子变量 本…

Linux网络基础 — 应用层

目录 应用层 再谈 "协议" 网络版计算器 HTTP协议 认识URL urlencode和urldecode HTTP协议格式 HTTP请求 HTTP响应 HTTP的方法 HTTP的状态码 HTTP常见Header 拓展知识&#xff08;了解&#xff09; 长链接 http周边会话保持 基本工具(http) 应用层 程序…

MOS管电源开关电路的缓启动功能是怎么实现的

先看一个电路&#xff1a; 其主要设计思路是使用MOS管来做一个开关&#xff0c;控制电源输出&#xff1b; 为什么选用MOS管&#xff1f; 这就涉及到MOS管的两个重要特性&#xff1a; 1.MOS管的导通电流大&#xff1b; 2.MOS管导通时内阻小&#xff0c;内部功耗低&#xff1b…

Probit模型、Logit模型、IV-Probit模型、IV-Probit模型

概述 Y β 1 X 1 β 2 X 2 ϵ i Y\beta_1X_1\beta_2X_2\epsilon_i Yβ1​X1​β2​X2​ϵi​ 边际效应&#xff1a;就是系数&#xff0c;即 β 1 \beta_1 β1​ 、 β 2 \beta_2 β2​ 解释&#xff1a;如&#xff0c;在控制其他变量&#xff08;条件&#xff09;不变的情况…

常用设计模式之单例模式

文章目录 饿汉式和懒汉式多线程中的懒汉式单例模式内存释放问题单例模式优缺点单例应用场景测试代码 饿汉式和懒汉式 单例模式是指在任何时候都保证只有一个类实例&#xff0c;并提供一个访问它的全局访问节点。 单例模式结构图&#xff1a; 解释&#xff1a;单例模式就是一…

罗湖区田心村旧改确认实施主体的公示,华润集团开发

深圳市罗湖区城市更新和土地整备局发布关于罗湖区笋岗街道田心村改造项目一期子项目2&#xff08;1-14、1-16、1-17地块&#xff09;确认实施主体的公示。 田心村改造项目位于罗湖区笋岗街道田心村&#xff0c;2012年4月&#xff0c;深圳市城市规划委员会建筑与环境艺术委员会2…

关于ElementPlus中的表单验证

关于ElementPlus中表单的校验规则&#xff0c;官网文档已经给出了&#xff0c;但是没有说明性文字&#xff0c;所以我想来记录一下&#xff0c;给出一些文字说明 ElementPlus中的简单校验 ElementPlus的表单的一般结构是&#xff1a; <el-form><el-form-item>&l…

(一)CSharp-Net框架

.NET框架由三部分组成&#xff1a; 1.编程工具。 2.基类库(BCL). 3.公共语言运行库(CLR) CLR 在运行时管理程序的执行&#xff0c;包括以下内容&#xff1a; 内存管理和垃圾收集。代码安全验证。代码执行、线程管理及异常处理。 NET 框架的特点以及其带来的好处&#xff1a…

web测试工程师的工作职责(合集)

web测试工程师的工作职责1 职责: 1、 负责数据平台产品的测试工作&#xff0c;参与产品需求分析&#xff0c;负责方案制定,并能预先评估项目风险&#xff0c;确保测试活动的顺利开展; 2、 深入理解系统内部的设计原理&#xff0c;并能从测试的角度提供优化意见; 3、 根据产品需…

【Linux】多线程概念初讲

线程大章节第一篇文章 文章目录 前言一、linux线程基本概念二、线程与进程的对比 1.线程控制的接口总结 前言 什么是线程呢&#xff1f; 在一个程序里的一个执行路线就叫做线程&#xff08; thread &#xff09;。更准确的定义是&#xff1a;线程是 “ 一个进程内部的控制…

Nginx+Tomcat负载均衡、动静分离,4层代理,7层代理

一&#xff1a;7层反向代理 Nginx 服务器&#xff1a;192.168.52.200:80 Tomcat服务器1&#xff1a;192.168.52.201:80 Tomcat服务器2&#xff1a;192.168.52.108:8080 192.168.52.108:8081 一.部署Nginx 负载均衡器 1.关闭防火墙 注意&#xff1a;所有的虚拟机都要注意关闭防…

硬件入门什么是之电阻

第1章 硬件入门什么是之电阻 文章目录 第1章 硬件入门什么是之电阻[TOC] 一、电阻基本概念二、电路设计实际应用1.限流( 恒流)2.分压 { 采样&#xff1a;电阻精度至少为1%}3.上拉和下拉4.分担功耗5.通信芯片的阻抗匹配 总结 一、电阻基本概念 对电流有阻碍作用的导体叫做&…

NFS(Network File System)服务搭建

NFS基础服务搭建 环境介绍:服务拓扑:nfs serverclient1临时挂载永久挂载client2临时挂载永久挂载注意事项:环境介绍: 系统全为centos7系统 使用本地yum源 服务拓扑: nfs server yum -ty install nfs-utilst rpcbind setenforce 0 mkdir /var/{world,cloud} echo -e “/va…