[원본] auto_increment 값 및 테이블 행 수를 포함하여 MySQL 테이블 정보 스키마가 시간 내에 업데이트되지 않는 문제 해결

머리말

데이터베이스는 설치 패키지의 템플릿 라이브러리가 될 것이기 때문에 그 불필요한 데이터를 삭제하고 일부 구성 데이터 만 유지해야하므로 auto_increment를 다시 실행하고 테이블 무리의 데이터를 지우는 것이 필요하지만 내가 찾았습니다. 설정 auto_increment 및 테이블 절단 후 DBeaver의 auto_increment는 여전히 원래 값이고 데이터 볼륨도 원래 값입니다.아무리 새로 고쳐도 쓸모가 없습니다.이것은 나를 매우 짜증나게 합니다. 그 결과 많은 정보를 확인한 결과 MySQL 자체의 문제인 것으로 판명되었고, Innodb는 테이블 정보를 MySQL의 information_schema 테이블에 즉시 저장하지 않기 때문에 DBeaver에 auto_increment가 설정되어 있어도 복원됩니다. 새로 고침 후.

 F5를 누른 후

사실 수정은 성공했는데 새로고침 후 복원이 되어서 이 테이블의 데이터가 정말 지워졌는지 알 수가 없었고, auto_increment가 복원이 되었는지는 알 수 없었습니다. 

예비 솔루션

MySQL의 Global 설정 수정에 대한 글을 많이 읽었는데, 이는 MySQL의 실행 효율에 심각한 영향을 미칠 것 같아서 시도해 보았지만 잘 되지 않았습니다. 예를 들면 다음과 같습니다.

글로벌 설정 innodb_stats_on_metadata=on;

위의 문장이 실행된 후에는 아무 소용이 없습니다.

그럼 또 다른 문장이 있습니다

ANALYZE TABLE {테이블 이름};

이거 진짜 유용하긴 한데 한번에 하나의 테이블만 새로고침이 가능해요 수백개의 테이블을 바꿔봤고 수동으로 100번도 넘게 실행해야하고 매번 테이블명이 달라요 누가 참겠어요! 따라서 더 나은 솔루션을 찾아야 했습니다.

결국 저는 Python을 선택했습니다.

마지막 해결책

Python을 사용하여 모두 새로고침합니다. 코드는 다음과 같습니다.

import pymysql

connection = pymysql.Connection(
    host="127.0.0.1",
    port=3306,
    user="root",
    password='123456'
)

cursor = connection.cursor()
connection.select_db("test_db")
result = cursor.execute("show tables")
allTables: tuple = cursor.fetchall()

for table in allTables:
    tableName = table[0]
    print(f"table name is {tableName} start analyze")
    cursor.execute(f"ANALYZE TABLE {tableName}")

pymysql을 사용하여 Python이 자체 데이터베이스에 연결하도록 한 다음 모든 테이블을 쿼리하고 루프에서 ANALYZE TABLE을 실행합니다.

파이썬으로 작성된 줄의 수는 정말 적고 실행하기 가장 편리합니다.

부록

pymysql 설치 방법은 다음과 같습니다.

가장 빠르고 안전한 설치 방법입니다.

Guess you like

Origin blog.csdn.net/DCTANT/article/details/130196481