문제 설명
생성된 열을 추가하면 MariaDB가 충돌함 (Adding Generated Columns Crashes MariaDB)
도커 컨테이너에서 실행 중인 생성된 열과 MariaDB에서 이상한 버그가 발생했습니다.
사용 중인 이미지는 mariadb:10
입니다.
생성 열을 추가하려고 했습니다. 내가 추가한 첫 번째 열은 잘 작동합니다. 두 번째로 추가하면 컨테이너가 충돌하고 테이블이 파괴됩니다.
작동하는 첫 번째 열은 다음과 같습니다.
ALTER TABLE program
ADD is_current tinyint AS (
IF (
status IN ('active', 'suspended')
AND start_date >= NOW(),
1,
0
)
);
이 열은 잘 작동합니다. 다음 SQL은 컨테이너를 충돌시킵니다.
ALTER TABLE program
ADD is_covered tinyint AS (
IF (
status IN ('active', 'suspended')
AND start_date <= NOW(),
1,
0
)
);
컨테이너를 다시 시작한 후 다음 오류가 발생합니다.
SELECT * FROM program;
[42S02][1932] Table 'my_local.program' is 충돌한 것으로 표시되어 복구해야 함
repair table my_local.program;
테이블 'my_local.program' 엔진에 존재하지 않음/작업 실패
이 질문 컨테이너에 ibdata1
파일이 있는지 확인했습니다. 테이블의 .ibd
및 .rfm
파일과 마찬가지로 존재합니다.
이 문제를 해결할 수 없었습니다. 테이블을 삭제하고 다시 만들고 데이터를 다시 가져와야 했습니다.
누구나 제안 사항이 있으면 듣고 싶습니다.
참조 솔루션
방법 1:
Checking the reference for MySQL 8 for generated columns I find that
Literals, deterministic built‑in functions, and operators are permitted. A function is deterministic if, given the same data in tables, multiple invocations produce the same result, independently of the connected user. Examples of functions that are nondeterministic and fail this definition: CONNECTION_ID(), CURRENT_USER(), NOW().
This is also true of MySQL 5.7.
When I attempted to create your generated column with MySQL 8 I got this message:
Error Code: 3763. Expression of generated column 'is_covered' contains a disallowed function: now.
I note, however, that you are using mariadb:10
. Although it is derived from MySQL, MariaDB is now effectively a different product.
The MariaDB reference for generated columns says: (for 10.2.1 onwards):
Non‑deterministic built‑in functions are supported in expressions for not indexed VIRTUAL generated columns. Non‑deterministic built‑in functions are not supported in expressions for PERSISTENT or indexed VIRTUAL generated columns.
So, If you have MySQL you can't do this at all. If you have MariaDB 10.2.1+ you should be able to do it with certain limitations.
In any case, you should get an error message, not a crashed table. I suggest you check the MariaDB bug reports, and submit one if this is not already there.
(by qotsa42、Tangentially Perpendicular)