>  기사  >  데이터 베이스  >  일반적인 MySQL 문제 및 솔루션

일반적인 MySQL 문제 및 솔루션

小云云
小云云원래의
2017-11-21 09:43:102503검색

프로그래머로서 우리가 MySQL을 사용하게 될 것은 분명하고 매우 중요한 일입니다. 그러나 때로는 직장에서 MySQL 데이터베이스에 필연적으로 일부 문제가 발생할 수 있는데 어떻게 처리해야 할까요? 일상 업무에서 접하게 되는 몇 가지 일반적인 MySQL 문제와 솔루션에 대해 이야기해 보겠습니다.

1. MySQL 루트 비밀번호를 잊어버렸습니다.

1. 데이터베이스가 있는 서버에 로그인하고 mysql 프로세스를 수동으로 종료합니다.

(1) 데이터베이스가 있는 서버에 로그인하고 MySQL 프로세스를 수동으로 종료합니다.

root@bogon:/data/mysql# kill `cat ./mysql.pid`

그 중, mysql.pid는 MySQL 데이터 디렉터리에 있는 pid 파일을 참조하며 MySQL 서비스의 프로세스 번호를 기록합니다.

(2) --skip-grant-tables 옵션을 사용하여 MySQL 서비스를 다시 시작합니다.

zj@bogon:/data/mysql$ sudo /usr/local/mysql/bin/mysqld --skip-grant-tables --user =root &

--skip-grant-tables 옵션은 MySQL 서비스를 시작할 때 승인 테이블 인증을 건너뛰는 것을 의미합니다. 일단 시작되면 루트는 MySQL에 연결하기 위해 비밀번호가 필요하지 않습니다.

(3) 빈 비밀번호를 사용하여 루트 사용자로 mysql에 연결하고 루트 비밀번호를 변경합니다.

zj@bogon:/usr/local/mysql/bin$ mysql -uroot
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3Server version: 5.7.18-log Source distribution
Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MySQL [(none)]> set password = password('123456');
ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statementMySQL [(none)]> use mysql
Database changed
MySQL [mysql]> update user set authentication_string=password('123456') where user="root" and host="localhost";
Query OK, 1 row affected, 1 warning (0.02 sec)
Rows matched: 1  Changed: 1  Warnings: 1MySQL [mysql]> flush privileges;
Query OK, 0 rows affected (0.00 sec)
MySQL [mysql]> exit;
Bye
****************************************************************
zj@bogon:/usr/local/mysql/bin$ mysql -uroot -p123456
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 7Server version: 5.7.18-log Source distribution
Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MySQL [(none)]>

--skip-grant-tables 옵션을 사용하여 시작하기 때문에 "set Password" 명령을 사용하여 변경합니다. 비밀번호가 실패하면 사용자 테이블을 직접 업데이트합니다.authentication_string(테스트 버전은 5.7.18, 일부 버전의 비밀번호 필드는 'password')을 설정한 후 비밀번호가 성공적으로 변경되었습니다. 권한 인증을 다시 검증하려면 권한 테이블을 새로 고치세요. 다시 루트로 로그인하시면 방금 변경한 비밀번호를 사용하실 수 있습니다.

2. myisam 스토리지 엔진에서 테이블 손상을 처리하는 방법

때때로 myisam에서 테이블 손상이 발생할 수 있습니다. 손상된 테이블의 증상은 일반적으로 쿼리가 예기치 않게 중단되고 다음 오류가 표시되는 것입니다.

'table_name.frm'이 변경을 위해 잠겨 있습니다.

파일 'tbl_name.MYYI'을 찾을 수 없습니다(errcode: nnn)

예기치 않은 파일 end

로그 파일이 손상되었습니다.

테이블 프로세서에서 nnn 오류가 발생했습니다.

일반적으로 두 가지 솔루션이 있습니다.

1 myisamchk 도구를 사용합니다.

Myisamchk 도구를 사용하여 복구합니다.

shell> myisamchk -r tablename

-r 매개변수의 의미는 복구입니다. 위와 같이 이 방법으로 거의 모든 문제를 해결할 수 있습니다. 그렇지 않은 경우

shell> mysiamchk -o tablename

명령을 사용하세요. 여기서 -o 매개변수는 --safe-recover를 의미하므로 더 안전한 복구를 수행할 수 있습니다.

2. SQL 명령 사용

MySQL의 검사 테이블 명령과 복구 테이블 명령을 함께 사용하면 테이블이 손상되었는지 확인하는 데 사용됩니다.

3. 데이터 디렉터리의 디스크 공간 부족 문제

시스템이 온라인 상태가 된 후 데이터의 양이 계속 증가함에 따라 데이터 디렉터리의 사용 가능한 공간이 점점 작아지는 것을 확인할 수 있습니다. , 애플리케이션에 보안 위험을 초래합니다.

1. myisam 스토리지 엔진의 테이블의 경우

myisam 스토리지 엔진의 테이블의 경우, 테이블을 생성할 때 다음 옵션을 사용하여 데이터 디렉터리와 인덱스 디렉터리를 서로 다른 디스크 공간에 저장할 수 있습니다. :

data 디렉터리 = '디렉터리 절대 경로'index 디렉터리 = '디렉터리 절대 경로'

테이블이 생성된 경우 종료하거나 잠그기만 할 수 있습니다. 먼저 테이블에 대한 변경을 방지하기 위해 테이블을 삭제한 다음 테이블의 데이터 파일을 저장하고 인덱스 파일 mv를 디스크의 충분한 파티션으로 이동한 다음 원본 파일에 대한 심볼릭 링크를 만듭니다.

2. innodb 스토리지 엔진의 테이블용

데이터 파일과 인덱스 파일은 함께 저장되기 때문에 분리할 수 없습니다. 디스크 공간이 부족한 경우 공간이 충분한 디스크에 새로운 데이터 파일을 추가하여 배치할 수 있습니다.
구체적인 구현 방법은 innodb_data_file_path 매개변수에 이 파일을 추가하는 것이며, 경로는 새 디스크의 절대 경로로 작성됩니다.
예를 들어 /home 아래에 공간이 부족하고 자동으로 데이터를 확장할 수 있는 /home1 아래에 새 파일을 추가하려는 경우 매개변수를 다음과 같이 작성할 수 있습니다.

innodb_data_file_path = /home/ibdata1:2000M;/ home1/ibdata2:2000M:autoextend

매개변수가 수정된 후 적용하려면 데이터베이스를 다시 시작해야 합니다.

4. DNS 역방향 확인 문제(5.0 이후 버전은 기본적으로 도메인 이름 역방향 확인 건너뛰기)

클라이언트에서 show processlist 명령을 실행하면 다음과 유사한 프로세스가 많이 나타날 수 있습니다.

인증되지 않은 사용자 | 192.168. 10.10:55644 | null | 연결 | null | 로그인 null

이러한 프로세스가 점점 더 많아지고 애플리케이션이 정상적으로 응답하지 못해 시스템이 마비됩니다.

기본적으로 MySQL은 원격 연결의 IP 주소에 대한 도메인 이름의 역분석을 수행합니다. 시스템의 호스트 파일에 해당 도메인 이름이 없으면 MySQL은 해당 연결을 잘못된 사용자로 간주하므로 다음 프로세스는 다음과 같습니다. 인증되지 않은 사용자가 표시되어 프로세스가 차단됩니다.

해결 방법은 매우 간단합니다. 시작할 때 --skip-name-resolve 옵션을 추가하면 MySQL이 도메인 이름 확인 프로세스를 건너뛰고 위의 문제를 피할 수 있습니다.

5.mysql.sock 분실 후 데이터베이스에 접속하는 방법

MySQL 서버 자체에서 데이터베이스에 접속할 때, mysql.sock이 존재하지 않아 접속이 안되는 문제가 종종 발생합니다. . 이는 호스트 이름으로 localhost를 지정하면 mysqladmin이 기본적으로 tcp/ip 대신 Unix 소켓 파일 연결을 사용하기 때문입니다. 이 소켓 파일(보통 mysql.sock이라는 이름)은 다양한 이유로 삭제되는 경우가 많습니다. --protocol=TCP|SOCKET|PIPE|MEMORY 옵션을 통해 사용자는 연결 프로토콜을 명시적으로 지정할 수 있습니다. 다음은 Unix 소켓 실패 후 tcp 프로토콜을 사용한 성공적인 연결을 보여줍니다.

1. Unix 소켓 연결:

zj@bogon:~$ mysqlERROR 2002 (HY000): 소켓 '/tmp/mysql.sock'을 통해 로컬 MySQL 서버에 연결할 수 없습니다. (2)

2.

zj@bogon:~$ mysql --protocol=TCP

이 기사는 MySQL이 다섯 가지 데이터베이스에서 직면할 수 있는 문제와 해결책을 공유합니다. 이 기사가 도움이 된다면 서둘러 수집해 보세요. 그것.

관련 권장 사항:

가장 안전한 MySQL 데이터베이스를 설정하는 방법은 무엇입니까?

MySQL 데이터 테이블의 인덱스 방법 보기

MySQL 트리거에 대한 질문

위 내용은 일반적인 MySQL 문제 및 솔루션의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.