MySQL 데이터를 파일로 출력 할 수 없습니다


13

MySQL 테이블의 데이터를 파일로 출력하려고하지만 권한 오류가 발생합니다.

$ pwd
/home/dotancohen
$ mkdir in
$ chmod 777 in/
$ mysql -ugs -p
mysql> USE someDatabase;
mysql> SELECT * FROM data INTO OUTFILE '/home/dotancohen/in/data.csv';
ERROR 1045 (28000): Access denied for user 'gs'@'localhost' (using password: YES)
mysql>

문제의 디렉토리가 777로 chmodded되면 왜 MySQL 사용자가 파일을 쓸 수 없습니까? 흥미롭게도 / tmp /에도 쓸 수 없습니다.

편집 : DB 사용자에게 적절한 MySQL 권한이있는 것처럼 보입니다.

mysql> show grants;
+----------------------------------------------------------------------------------+
| Grants for gs@localhost                                                          |
+----------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'gs'@'localhost' IDENTIFIED BY PASSWORD 'somePassword'     | 
| GRANT ALL PRIVILEGES ON `gs\_%`.* TO 'gs'@'localhost'                            | 
+----------------------------------------------------------------------------------+
2 rows in set (0.01 sec)

2
전체 디렉토리 트리에서 MySQL에 대한 액세스 권한을 부여해야합니다. inMySQL이 액세스 할 수없는 경우 권한 부여 는 의미가 없습니다 dotanchoen. 즉, 은행 금고의 안전 퇴장 상자를 넓게 열 수 있지만 은행 금고 문이 잠겨 있으면 상자에 들어 가지 않습니다. 귀하의 gs사용자는 또한 MySQL을해야합니다 FILE실제로 쿼리를 실행하는 권한을.

문제는 선택 파마가 없을 수 있습니까? MySQL 권한은 디렉토리 권한에 의해 제어되지 않습니다. 특정 mysql 사용자로 실행하려면 mysql -u <username> -p를 사용해야합니다. 사용자에게 db에 대한 액세스 권한을 부여하려면 MySql 부여를 살펴보십시오. dev.mysql.com/doc/refman/5.1/en/grant.html

감사합니다.이 사용자에게는 SELECT권한이 있습니다. 나는 종종이 사용자로서 데이터베이스를 탐색한다.
dotancohen

고마워, 마크, 내가 두려웠 어 따라서 다른 사용자가 내 홈 디렉토리를 읽거나 쓰지 못하게 할 수있는 "받은 편지함"폴더를 가질 수 없습니까?
dotancohen

2
MySQL docs에FILE 설명 된대로 사용자에게 권한 이 있는지 확인하십시오 .
Mike Purcell

답변:


12

SELECT ... INTO OUTFILE 에 대한 MySQL 문서에 따르면

INTO OUTFILE 또는 INTO DUMPFILE로 작성된 파일은 서버 호스트의 모든 사용자가 쓸 수 있습니다. 그 이유는 MySQL 서버가 자신의 계정으로 실행중인 사용자 이외의 다른 사람이 소유 한 파일을 만들 수 없기 때문입니다. (이러한 이유로 다른 이유로 mysqld를 절대로 실행해서는 안된다.) 따라서 파일은 내용을 조작 할 수 있도록 세계적으로 쓸 수 있어야한다.

SELECT INTO OUTFILE다음과 같이 / var / lib / mysql에 출력해야 합니다.

SELECT * FROM data INTO OUTFILE 'data.csv';

물론 gs @ localhost에 대한 FILE 권한이 있는지 확인해야합니다.

이 권한을 부여하는 두 가지 방법이 있습니다

방법 # 1

GRANT FILE ON *.* TO 'gs'@'localhost';

방법 # 2

UPDATE mysql.user SET File_priv = 'Y' WHERE user='gs' AND host='localhost';
FLUSH PRIVILEGES;

업데이트 2012-05-01 07:09 EDT

FILE 권한을 부여하려면 다음을 수행하십시오.

  • 1 단계) service mysql restart --skip-networking --skip-grant-tables
  • 2 단계) mysql <hit enter>
  • 단계 03) UPDATE mysql.user SET File_priv = 'Y' WHERE user='gs' AND host='localhost';
  • 단계 04) exit
  • 단계 05) service mysql restart

감사. 의 출력으로 질문을 업데이트했습니다 SHOW GRANTS. DB 사용자에게 적절한 권한이 있어야합니다.
dotancohen

DB 사용자에게 적절한 권한이 없습니다. FILE 권한은 및과 GRANT ALL PRIVILEGES ON *.*마찬가지로 사용자에게만 부여됩니다 . 글로벌 관리 권한이기 때문입니다. 당신이 가진 특권은을위한 전용 데이터베이스. RELOADSHUTDOWNGRANT ALLgs
RolandoMySQLDBA

1

다른 배포판과 OS는 모두 OUTFILE의 대상 을 동일하게 처리하지 않습니다 .

예를 들어 소켓을 사용하는 Linux에서 mysqld 데몬을 실행할 때 OUTFILE이 /tmp디렉토리에 기록되는 경우가 있습니다. 큰 문제는 아니지만 OUTFILE 접근 방식을 사용하는 것에는 단점이 있습니다. 즉 권한을 처리하고 파일의 위치를 ​​찾는 것입니다.

이 질문의 목적은 구체적으로 "OUTFILE 사용 방법"이 아니지만 일부 MySQL 데이터를 파일로 캡처하려고하는 경우 FILE 권한 등으로 뒤섞을 필요가없는 대안이 있습니다. .

$ (echo 'SELECT * FROM data' | mysql -ugs -p[password])> /home/dotancohen/in/data.csv

이 출력은 기본적으로 탭으로 구분됩니다. 쉼표의 sed경우 파일에 쓰기 전에 파일을 꿰어 놓거나 다른 항목으로 연결하십시오.


1

이 페이지와 StackOverflow의 다른 많은 페이지에 대한 제안을 이해하려고 몇 시간을 보냈습니다.

MySql에서 권한을 어떻게 변경했는지에 관계없이 아무것도 작동하지 않습니다.

처음 시작한 권한으로 되돌 렸습니다.

궁극적으로 나를 위해 일한 것은 다른 사람들의 제안보다 간단했습니다.

echo "select id, emailAddress FROM contacts" | mysql --user=myusername --password mydatabasename > /home/my_output_file.tsv


1
Bash CLI에서 사용하는 방법이 좋습니다. 그러나 OP의 질문은 MySQL 클라이언트 CLI에서 파일로 데이터를 출력하는 방법에 대해 묻습니다.
dotancohen

0

위에서 언급 한 CSV로 데이터를 출력하는 두 가지 방법 (실제로 TSV이어야 함) 과 관련하여 내보내는 항목에 빈 값있으면 잘못 할당되어 데이터가 엉망이 될 위험이 있음을 발견했습니다. 해당 열에 대한 데이터

복구를위한 데이터 무결성을 염두에두고이 웹 사이트를 찾았습니다.

https://www.eversql.com/exporting-mysql-schema-structure-to-xml-using-mysql-clients/

그것은 그 언급 --xml에 옵션 mysqldump다음 TSV를 포함하여 필요한 형식에 사용자 정의 스크립트에 의해 구문 분석 할 수있는 XML 형식으로 데이터를 내보낼 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.