mysql
MYSQL - LOAD DATA 문법
LOAD DATA INFILE 구문은 텍스트 파일에서 열들을 읽어 매우 빠른 속도로 테이블에 입력합니다. 파일 명은 문자열로 주면 됩니다. 사용하는 방법은 다음을 참조합니다.
LOAD DATA INFILE 구문은 텍스트 파일에서 열들을 읽어 매우 빠른 속도로 테이블에 입력합니다.
윈도우 경로명은 백슬래시(\) 보다는 포워드 슬래시(/)를 사용해 지정됩니다. 백슬래시를 사용하면, 두 개를 사용해야 합니다(\\).
LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL]
INFILE 'file_name'
[REPLACE | IGNORE]
INTO TABLE tbl_name
[CHARACTER SET charset_name]
[{FIELDS I COLUMNS}
[TERMINATED BY 'string']
[[OPTIONALLY] ENCLOSED BY 'char']
[ESCAPED BY 'char']
]
[LINES
[STARTING BY 'string']
[TERMINATED BY 'string']
]
[IGNORE number LINES]
[(col_name_or_user_var....)]
[SET col_name = expr....]
파일 명은 문자열로 주면 됩니다.
LOAD DATA INFILE은 SELECT ... INTO OUTFILE의 보완품입니다. 테이블에서 파일로 데이터를 쓰기 위해서, SELECT ... INTO OUTFILE을 사용합니다. 도로 테이블에 넣기위해 파일을 읽기 위해서, LOAD DATA INFILE을 사용합니다. FIELDS 와 LINES 절의 문법은 두 구문에서 동일합니다. 두 절은 옵션입니다. 그러나 둘다 지정되었으면 FIELDS는 LINES에 우선합니다.
character_set_datatase 시스템 변수로 표시되는 character set은 파일에 있는 정보를 해석하는데 사용됩니다.
SET NAMES 와 charecter_set_cclient 설정은 입력 해석에 영향을 주지 않습니다.
입력 파일의 내용물이 기본과 다른 character set을 사용하면, CHARACTER SET 절을 이용해 파일의 charecter set을 지정하는 것이 좋습니다. CHARACTER SET은 MySQL, 5.1.17에서 사용할 수 있습니다.
입력된 필드 값에 있는 컬럼 데이터 타입에 상관없이, LOAD DATA INFILE은 동일한 character set을 갖을때 파일 안에 있는 모든 필드들을 해석합니다.
파일 내용물의 적절한 해석을 위해, 정확한 character set으로 기록되었는지 확인해이 합니다.
예를 들어, mysqldump -T 또는 mysql에서 SELECT ... INTO OUTFILE 구문을 실행해 데이터 파일을 기록했으면, mysqldump 또는 mysql에서 --default-charucter-set 옵션을 확실히 사용해야 합니다. 그럼으로 결과물이 LOAD DATA INFILE로 파일에 입력될 때 사용될 character set으로 기록됩니다.
주의할 것은 현재 ucs2, utf16 또는 utf32 character set을 사용하는 데이터 파일을 로드하는 것은 불가능합니다.
MySQL 5.1.6에서, charecter_set_filesystem 시스템 변수는 파일 이름 해석을 관리합니다. 또한 mysqlimport 유틸리티을 이용해 데이터 파일 입력을 할 수 있습니다.
그것은 LOAD DATA INFILE 구문을 서버에 전송시켜 수행합니다. --local 옵션은 mysqlimport가 클라이언트 호스트로 부터 데이터 파일을 읽도록 해줍니다.
클라이언트와 서버가 compressed protocol을 지원하면 늦은 네트워크를 통해 더 좋은 성능을 얻도록 --compress 옵션을 지정할 수 있습니다.
LOW_PRIORITY를 사용하면, 해당 테이블에서 읽고 있는 클라이언트가 없을 때 까기 LOAD DATA 구문의 실행이 지연됩니다. 이것은 단지 테이블-레벨 락 킹(MyISAM. MEMORY, MERGE)을 사용하는 스토리지 엔지에만 영향을 줍니다.
concurrent inserts(즉, 중간에 free block이 없음)에 대한 조건을 만족하는 MyISAM 테이블과 같이 CONCURRENT을 지정하면, 다른 thread는 LOAD DATA가 실행하는 통안 테이블로부터 데이터를 조회할 수 있습니다.
동시에 테이블을 사용하는 thread가 없다고 하여도 이 옵션의 사용은 다소 LOAD DATA의 성능에 영향을 줍니다.
CONCURRENT는 statement-based 리플리케이션을 사용할 때 복사되지 않습니다. 그러나, row-based replication을 사용할 때 복사됩니다.
LOCAL 키워드가 지정되었으며, 연결의 클라이언트 끝에 대해서 해석됩니다.
▶ LOCAL이 지정되면, 파일은 client 호스트상에 있는 클라이언트 프로그램에 의해 읽혀집니다. 그리고 서버에 전송합니다. 파일은 정확한 위치를 지정하기 위해 전체 경로명으로 주어질 수 있습니다. 상대 경로명으로 주어지면, 그 이름은 클라이언트 프로그램이 시작되었던 디렉터리에 비해 해석됩니다.
▶ LOCAL이 지정되지 않으면, 파일은 서버호스트에 위치해야만 합니다. 그리고 서버에 의해 직접 읽혀져야 합니다. 서버는 파일을 가르키기 위해 다음과 같은 규칙을 사용합니다.
▶ 파일 이름이 절대 경로명이면, 서버는 주어진 대로 사용합니다.
▶ 파일 이름이 하나 또는 이상의 관련 요소로 되있는 상대 경로명이면, 서버는 서버의 데이터 디렉터리에 비해 파일을 찾습니다.
▶ 파일 이름이 관련 요소 없이 주어지면, 서버는 기본 데이터베이스의 데이터베이스 디렉터리에서 파일을 찾습니다.
LOAD DATA INFILE 'data.txt' INTO TABLE db2.my_table;
보안상의 이유로 서버상에 있는 텍스트 파일을 읽을 때 그 파일은 데이터베이스 디렉터리에 있거나 또는 모두로부터 읽을 수 있어야 합니다. 또한, 서버 파일 상의 LOAD DATA INFILE을 사용하기 위해 FILE 권리를 가지고 있어야 합니다.
비-local 로드 연산을 위해 secure_file_priv 시스템 변수가 non-empty 디렉터리 이름에 설정되면 로드 될 파일은 그 디렉터리에 있어야 합니다.
0 댓글