한 번에 모든 테이블 복구


112

한 번에 데이터베이스의 모든 테이블을 확인하는 방법은 무엇입니까?

check table ''tablename'';모든 테이블에 대한 쿼리 를 하나씩 입력하는 대신 .

이와 같은 간단한 명령 check all이 있습니까?

답변:



108

명령은 다음과 같습니다.

mysqlcheck -u root -p --auto-repair --check --all-databases

요청시 비밀번호를 제공해야합니다.

또는 이것을 실행할 수 있지만 암호가 일반 텍스트로 작성되므로 권장되지 않습니다.

mysqlcheck -u root --password=THEPASSWORD --auto-repair --check --all-databases

7
mysqlcheck의 -u 루트 -p --auto-수리 --check --optimize --all-데이터베이스 오류 : mysqlcheck의 여러 모순 명령을 지원하지 않습니다
Alekc

11
모순되는 명령 오류가 발생하면 --optimize 옵션을 제거하십시오.
Sarcastron 2015 년

자동 복구, 확인 또는 최적화 옵션 중 하나만 사용해야한다고 생각합니다. 자동 복구 만 사용하고 작업했습니다
Packet Tracer

나는 당신이 말한 것을 시도했지만 나는 얻는다 : mysqlcheck : Got error : 1045 : Access denied for user 'root'@ 'localhost'(using password : YES) when trying to connect and I are using the correct password.
Doug

24

다음 쿼리를 사용 REPAIR하여 데이터베이스 내의 모든 테이블에 대한 SQL 통계 를 인쇄 합니다.

select concat('REPAIR TABLE ', table_name, ';') from information_schema.tables 
where table_schema='mydatabase'; 

그 후 모든 쿼리를 복사하고 mydatabase.

참고 : mydatabase원하는 DB 이름으로 교체


9

암호를 입력 할 필요없이 다음 명령 중 하나만 사용하면됩니다 (자체 설명).

mysqlcheck --all-databases -a #analyze
mysqlcheck --all-databases -r #repair
mysqlcheck --all-databases -o #optimize

8

다음 명령은 Windows에서 명령 프롬프트 (관리자 권한)를 사용하여 저에게 효과적이었습니다.

mysqlcheck -u root -p -A --auto-repair

루트 사용자로 mysqlcheck를 실행하고, 암호를 입력하고, 모든 데이터베이스를 확인하고, 손상된 테이블을 자동 복구합니다.


3

이를 수행하는 기본 명령은 없지만 작업을 수행하는 프로 시저를 작성할 수 있습니다. 행을 반복 하고 모든 행을 information_schema호출 REPAIR TABLE 'tablename';합니다. CHECK TABLE준비된 명령문에는 아직 지원되지 않습니다. 다음은 예입니다 (MYDATABASE를 데이터베이스 이름으로 대체).

CREATE DEFINER = 'root'@'localhost'
PROCEDURE MYDATABASE.repair_all()
BEGIN
  DECLARE endloop INT DEFAULT 0;
  DECLARE tableName char(100);
  DECLARE rCursor CURSOR FOR SELECT `TABLE_NAME` FROM `information_schema`.`TABLES` WHERE `TABLE_SCHEMA`=DATABASE();
  DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET endloop=1;

  OPEN rCursor;
  FETCH rCursor INTO tableName;

  WHILE endloop = 0 DO
    SET @sql = CONCAT("REPAIR TABLE `", tableName, "`");
    PREPARE statement FROM @sql;
    EXECUTE statement;

    FETCH rCursor INTO tableName;
  END WHILE;

  CLOSE rCursor;
END

1

쉘에서 간단한 확인을 위해 이것을 좋아합니다.

mysql -p<password> -D<database> -B -e "SHOW TABLES LIKE 'User%'" \
| awk 'NR != 1 {print "CHECK TABLE "$1";"}' \
| mysql -p<password> -D<database>

1
mysql -ss출력에서 생략 된 열 이름을 만드는 데 사용할 수 있습니다. NR != 1그러면 코드에서 제거 할 수 있습니다
Fluffy

1

plesk 호스트의 경우 다음 중 하나를 수행해야합니다. (둘 다 동일하게 수행)

mysqlrepair -uadmin -p$(cat /etc/psa/.psa.shadow) -A
# or
mysqlcheck -uadmin -p$(cat /etc/psa/.psa.shadow) --repair -A

1

사용자 이름과 암호가 필요할 수 있습니다.

mysqlcheck -A --auto-repair -uroot -p

암호를 입력하라는 메시지가 표시됩니다.

mysqlcheck -A --auto-repair -uroot -p{{password here}}

크론에 넣으려면 암호가 일반 텍스트로 표시됩니다!


1

손상된 테이블이 남아있는 경우

mysqlcheck -A --auto-repair

시험

mysqlcheck -A --auto-repair --use-frm

-use-frm은 무엇을합니까?
davidman77 19-06-02

--use-frm MyISAM 테이블에 대한 복구 작업의 경우 .MYI 헤더가 손상 되어도 테이블을 복구 할 수 있도록 데이터 사전에서 테이블 구조를 가져옵니다. (참조 dev.mysql.com/doc/refman/8.0/en/... )
Laloi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.