¿Cómo verificar el cumplimiento del campo de tiempo de MySQL y Oracle?

Autor: Yu Zhenxing

Miembro del equipo de Acson DBA, interesado en compartir tecnología y escribir documentos técnicos.

Fuente de este artículo: contribución original

  • Producido por la comunidad de código abierto de Aikesheng, no se permite usar el contenido original sin autorización, comuníquese con el editor e indique la fuente para la reimpresión.

Información de contexto

En el proceso de migración de datos o actualización de una versión baja de la base de datos a una versión alta, a menudo se encuentra que los datos de tiempo insertados no cumplen con las especificaciones debido a la configuración poco precisa de los parámetros de la base de datos de la versión baja, y una se activa el error. Problema, ¿hay alguna manera de descubrir este tipo de datos irregulares por adelantado? A continuación, se proporciona una solución factible basada en Oracle y MySQL como referencia.

Método de verificación de datos de tiempo de Oracle

2.1 Crear una tabla de prueba e insertar datos de prueba

CREATE TABLE T1(ID NUMBER,CREATE_DATE VARCHAR2(20));

INSERT INTO T1 SELECT 1, '2007-01-01' FROM DUAL;
INSERT INTO T1 SELECT 2, '2007-99-01' FROM DUAL;            -- 异常数据
INSERT INTO T1 SELECT 3, '2007-12-31' FROM DUAL;
INSERT INTO T1 SELECT 4, '2007-12-99' FROM DUAL;            -- 异常数据
INSERT INTO T1 SELECT 5, '2005-12-29 03:-1:119' FROM DUAL;  -- 异常数据
INSERT INTO T1 SELECT 6, '2015-12-29 00:-1:49' FROM DUAL;   -- 异常数据

2.2 Crear un registro de registro de errores para la tabla

  • Oracle puede llamar DBMS_ERRLOG.CREATE_ERROR_LOGal paquete para registrar errores de SQL y registrar datos anormales, lo cual es muy útil.

  • El significado de los parámetros es el siguiente

    • T1para el nombre de la tabla
    • T1_ERRORTabla temporal para registrar errores en operaciones sobre la tabla
    • DEMOes el usuario propietario de la tabla
EXEC DBMS_ERRLOG.CREATE_ERROR_LOG('T1','T1_ERROR','DEMO');

2.3 Crear e insertar datos en una tabla temporal para verificar la validez de los datos de tiempo

-- 创建临时表做数据校验
CREATE TABLE T1_TMP(ID NUMBER,CREATE_DATE DATE);

-- 插入数据到临时表验证时间数据有效性(增加LOG ERRORS将错误信息输出到错误日志表)
INSERT INTO T1_TMP 
SELECT ID, TO_DATE(CREATE_DATE, 'YYYY-MM-DD HH24:MI:SS')
FROM T1 
LOG ERRORS INTO T1_ERROR REJECT LIMIT UNLIMITED;

2.4 Registro de errores de verificación

SELECT * FROM DEMO.T1_ERROR;

imagen-20221215162247472

La columna ID es la clave principal de la tabla, que se puede utilizar para localizar rápidamente filas de datos anormales.

Métodos para bases de datos MySQL

3.1 Cree una tabla de prueba para simular datos no estándar de versión baja

-- 创建测试表
SQL> CREATE TABLE T_ORDER(
    ID BIGINT AUTO_INCREMENT PRIMARY KEY,
    ORDER_NAME VARCHAR(64),
    ORDER_TIME DATETIME);

-- 设置不严谨的SQL_MODE允许插入不规范的时间数据
SQL> SET SQL_MODE='STRICT_TRANS_TABLES,ALLOW_INVALID_DATES';

SQL> INSERT INTO T_ORDER(ORDER_NAME,ORDER_TIME) VALUES 
    	('MySQL','2022-01-01'),
    	('Oracle','2022-02-30'),
    	('Redis','9999-00-04'),
    	('MongoDB','0000-03-00');

-- 数据示例
SQL> SELECT * FROM T_ORDER;
+----+------------+---------------------+
| ID | ORDER_NAME | ORDER_TIME          |
+----+------------+---------------------+
|  1 | MySQL      | 2022-01-01 00:00:00 |
|  2 | Oracle     | 2022-02-30 00:00:00 |
|  3 | Redis      | 9999-00-04 00:00:00 |
|  4 | MongoDB    | 0000-03-00 00:00:00 |
+----+------------+---------------------+

3.2 Crear una tabla temporal para la verificación normativa de datos

-- 创建临时表,只包含主键ID和需要校验的时间字段
SQL> CREATE TABLE T_ORDER_CHECK(
    ID BIGINT AUTO_INCREMENT PRIMARY KEY,
    ORDER_TIME DATETIME);
  
-- 设置SQL_MODE为5.7或8.0高版本默认值
SQL> SET SQL_MODE='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

-- 使用INSERT IGNORE语法插入数据到临时CHECK表,忽略插入过程中的错误
SQL> INSERT IGNORE INTO T_ORDER_CHECK(ID,ORDER_TIME) SELECT ID,ORDER_TIME FROM T_ORDER;

3.3 Comparación de datos

Haga una consulta asociada entre la tabla temporal y la tabla oficial y compare los datos inconsistentes.

SQL> SELECT 
	T.ID,
	T.ORDER_TIME AS ORDER_TIME,
	TC.ORDER_TIME AS ORDER_TIME_TMP
FROM T_ORDER T INNER JOIN T_ORDER_CHECK TC 
ON T.ID=TC.ID
WHERE T.ORDER_TIME<>TC.ORDER_TIME;

+----+---------------------+---------------------+
| ID | ORDER_TIME          | ORDER_TIME_TMP      |
+----+---------------------+---------------------+
|  2 | 2022-02-30 00:00:00 | 0000-00-00 00:00:00 |
|  3 | 9999-00-04 00:00:00 | 0000-00-00 00:00:00 |
|  4 | 0000-03-00 00:00:00 | 0000-00-00 00:00:00 |
+----+---------------------+---------------------+

un pequeño truco

Use expresiones regulares para hacer coincidir el campo de tiempo y use el método anterior para requisitos rigurosos.

-- Oracle 数据库
SELECT * FROM  T1 WHERE NOT REGEXP_LIKE(CREATE_DATE,'^((?:19|20)\d\d)-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])$');

	ID CREATE_DATE
---------- --------------------
	 2 2007-99-01
	 4 2007-12-99
	 5 2005-12-29 03:-1:119
	 6 2015-12-29 00:-1:49
	 
-- MySQL 数据库
-- 略,匹配规则还在调试中

Acerca de SQLE

El SQLE de la comunidad de código abierto de Akson es una herramienta de auditoría de SQL para usuarios y administradores de bases de datos, que admite la auditoría de escenarios múltiples, admite procesos en línea estandarizados, admite de forma nativa la auditoría de MySQL y tiene tipos de bases de datos escalables.

SQLE obtener

tipo DIRECCIÓN
Repositorio https://github.com/actiontech/sqle
documento https://actiontech.github.io/sqle-docs/
lanzamiento de noticias https://github.com/actiontech/sqle/releases
Documentación de desarrollo del complemento de auditoría de datos https://actiontech.github.io/sqle-docs-cn/3.modules/3.7_auditplugin/auditplugin_development.html

Supongo que te gusta

Origin blog.csdn.net/ActionTech/article/details/131400723
Recomendado
Clasificación