테이블 최근 수정일, 갱신일 확인

 

이번에는 테이블 마지막 업데이트 시간을 알고 싶을때 사용하는 방법에 대해 알아보겠습니다.


주의사항

 

MySQL 5.7버전 이하에는 InnoDB에 버그가 있어 정상적으로 UPDATE_TIME을 불러올수 없는 이슈가 있습니다.

또한 서버가 다시 시작되거나 테이블이 InnoDB 데이터 사전 캐시에서 제거되면 타임스탬프가 유지되지 않아 정상적으로 사용할 수 없습니다.

 

그래서 방법3에 직접 시간을 관리하는 방법도 같이 서술해놓겠습니다.


방법1. SHOW TABLE STATUS

 

SHOW TABLE STATUS LIKE '테이블명';
+------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+--------------------+----------+----------------+---------+
| Name       | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time         | Update_time         | Check_time | Collation          | Checksum | Create_options | Comment |
+------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+--------------------+----------+----------------+---------+
| test       | InnoDB |      10 | Dynamic    |    1 |          16384 |       16384 |               0 |            0 |         0 |           NULL | 2024-03-27 09:38:55 | 2024-03-27 09:39:05 | NULL       | utf8mb4_unicode_ci |     NULL |                |         |
+------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+--------------------+----------+----------------+---------+

 


방법2. INFORMATION_SCHEMA.TABLES

 

DB명과 테이블명으로 확인

SELECT UPDATE_TIME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'DB명'
	AND TABLE_NAME = '테이블명';
+---------------------+
| UPDATE_TIME         |
+---------------------+
| 2024-03-27 09:39:05 |
+---------------------+

 

테이블명으로 확인

SELECT UPDATE_TIME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME='테이블명';
+---------------------+
| UPDATE_TIME         |
+---------------------+
| 2024-03-27 09:39:05 |
+---------------------+

방법3. 직접 업데이트 시간 관리하기

 

CREATE TABLE test (
	id INT PRIMARY KEY,
	name CHAR(4),
	update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP 
			ON UPDATE CURRENT_TIMESTAMP,
	KEY (update_time)
);

 

테스트 테이블 test가 생성하겠습니다.

test에는 id와 name, 업데이트 시간을 관리하는 update_time 컬럼이 있습니다.

 

INSERT INTO test(id, update_time) VALUES (1, NOW());

SELECT * FROM test;
+----+------+---------------------+
| id | name | update_time         |
+----+------+---------------------+
|  1 | NULL | 2024-03-28 09:47:24 |
+----+------+---------------------+

 

위와같이 데이터를 넣으며 update_time을 관리해줍니다.

 

UPDATE test SET name = 'test' WHERE id = 1;

SELECT * FROM test;
+----+------+---------------------+
| id | name | update_time         |
+----+------+---------------------+
|  1 | test | 2024-03-28 09:50:22 |
+----+------+---------------------+

  

UPDATE를 하면 자동으로 update_time이 갱신됩니다.

 

SELECT MAX(update_time) FROM test;
+---------------------+
| MAX(update_time)    |
+---------------------+
| 2024-03-28 09:50:22 |
+---------------------+

 

테이블의 마지막 업데이트 시간을 보고싶으면 MAX 함수를 사용하여 확인할 수 있습니다.


마무리

 

잘못된 점이 있거나 궁금한 점이 있다면 언제든지 문의해주시기 바랍니다!

728x90
반응형

ERROR 1317 (70100): Query execution was interrupted


에러 환경

 

Client OS: Windows10

Server OS: Ubuntu 22.04.2 LTS

MySQL: 8.0.30


에러 원인

 

쿼리 처리시간이 너무 오래걸리거나 서버에 이상이 있어 쿼리를 정상적으로 실행을 할수없을 때 나타나는 에러입니다.


해결 방안

 

방법1.

MySQL 서버를 재시작합니다. 그리고 해결되었는지 확인합니다.

 

방법2.

SELECT 를 하거나 INSERT, UPDATE를 할 때 인덱스 사용유무에 따라 실행속도를 향상시킬수 있습니다.

# 인덱스 활성화
ALTER TABLE 테이블명 ENABLE KEYS;

# 인덱스 비활성화
ALTER TABLE 테이블명 DISABLE KEYS;

 

방법3.

max_allowed_packet는 서버와 클라이언트 사이에 주고받는 패킷의 사이즈를 설정하는 값으로 사이즈를 늘려 속도를 향상시킬 수 있습니다.

# max_allowed_packet 사이즈 확인
SHOW VARIABLES WHERE variable_name = 'max_allowed_packet';
+--------------------+----------+
| Variable_name      | Value    |
+--------------------+----------+
| max_allowed_packet | 67108864 |
+--------------------+----------+

# max_allowed_packet 사이즈 변경 ex)64Mb
SET GLOBAL max_allowed_packet = 64*1024*1024;

 

또는 my.ini 파일을 통해서도 변경할 수 있습니다.


마무리

 

공통적으로 해결할 수 있는 방법을 작성해보았습니다. 이외에도 연산시간이 오래걸리거나 루프가 너무 많아 오래걸리는 쿼리문같은 경우 적절한 수정을 통해 해결하면 좋을 것 같습니다.

잘못된 점이 있거나 궁금한 점이 있다면 언제든지 문의해주시기 바랍니다!

728x90
반응형

 

ERROR 1062 (23000): Duplicate entry '' for key 'PRIMARY'


에러 원인

 

INSERT 또는 UPDATE 할 때 중복된 PK값이 있을 때 발생합니다.


해결 방안

 

중복된 값이 있는지 확인하고 다시 작업을 합니다.

SELECT * FROM 테이블
WHERE 컬럼명 = '중복 체크 값'

 


마무리

 

잘못된 점이 있거나 궁금한 점이 있다면 언제든지 문의해주시기 바랍니다!

728x90
반응형

+ Recent posts