SQLite | SQLite 명령어 | 데이터베이스 덤프 (.dump 명령)
데이터베이스에 포함되어 있는 테이블 등의 정보를 SQL 문 형태로 출력하는 것을 덤프라고 한다. 덤프하게 되면 테이블 구조와 테이블에 저장되어 있는 하나 하나의 데이터에 대해 SQL 문 형태로 출력된다. 여기에서는 덤프의 사용법에 대해 설명한다.
또한 덤프한 내용을 새로운 데이터베이스로 가져와서 데이터베이스를 다시 작성하는 방법에 대해서는 덤프를 가져와서 데이터베이스 재구축 (.read 명령)를 참조한다.
덤프 사용
SQLite에서 덤프하려면 .dump 명령을 사용한다. 형식은 다음과 같다.
.dump? TABLE? ...
인수를 생략하고 .dump 명령을 실행하면, 데이터베이스에 대한 모든 정보를 덤프한다. 인수에 테이블명 을 지정하면 해당 테이블에 관해서만 덤프한다.
먼저, 각 모드를 확인하기 위해 예제가 되는 테이블을 만들고 데이터를 추가한다.
create table user (name text, old integer, address text);
insert into user values ('devkuma', 28, 'Seoul');
insert into user values ('kimkc', 22, 'Busan');
insert into user values ('araikuma', 32, 'Seoul');
insert into user values ('happykuma', 23, 'Seoul');
insert into user values ('mykuma', 23, 'Daejeon');
create index nameindex on user (name);
create table color (id integer, name text);
insert into color values (1, 'Red');
insert into color values (2, 'Blue');
insert into color values (3, 'White');
그러면 2개의 테이블과 1개의 인덱스가 생성된 데이터베이스에 연결하여 .dump 명령을 실행해 본다.
.dump
sqlite> .dump
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE user (name text, old integer, address text);
INSERT INTO user VALUES('devkuma',28,'Seoul');
INSERT INTO user VALUES('kimkc',22,'Busan');
INSERT INTO user VALUES('araikuma',32,'Seoul');
INSERT INTO user VALUES('happykuma',23,'Seoul');
INSERT INTO user VALUES('mykuma',23,'Daejeon');
CREATE TABLE color (id integer, name text);
INSERT INTO color VALUES(1,'Red');
INSERT INTO color VALUES(2,'Blue');
INSERT INTO color VALUES(3,'White');
CREATE INDEX nameindex on user (name);
COMMIT;
sqlite>
출력된 내용을 보면 테이블은 현재 생성되어 있는 테이블과 동일한 테이블을 생성하기 위한 CREATE TABLE 문, 그리고 테이블에 저장되어 있는 데이터와 동일한 데이터를 저장하기 위한 INSERT 문이 출력되고 있다. 이 출력된 SQL 문장을 순서대로 실행해 나가는 것으로 현재의 데이터베이스와 동일한 데이터베이스를 만들 수 있다.
전체 데이터베이스가 아닌 특정 테이블에 대한 덤프만 수행하려면 인수에 테이블명을 지정한다. 예를 들면 user 테이블에 대한 덤프를 출력해 본다.
.dump user
sqlite> .dump user
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE user (name text, old integer, address text);
INSERT INTO user VALUES('devkuma',28,'Seoul');
INSERT INTO user VALUES('kimkc',22,'Busan');
INSERT INTO user VALUES('araikuma',32,'Seoul');
INSERT INTO user VALUES('happykuma',23,'Seoul');
INSERT INTO user VALUES('mykuma',23,'Daejeon');
CREATE INDEX nameindex on user (name);
COMMIT;
sqlite>
덤프 결과를 파일로 출력
덤프 내용은 파일에 출력하여 사용하는 경우가 많을 것이기에, 파일에 출력하도록 옵션이 준비되어 있다. 파일에 출력하고 싶은 경우에는 .output 명령 사용하여 화면에 대한 출력을 지정된 파일에 대한 출력으로 변경하고 덤프한다. (.output 명령은 SELECT 문의 실행 결과를 파일로 출력 (.output 명령)를 참조한다.)
실제로 해보도록 하자. 우선 덤프의 실행 결과를 현재 디렉터리에 있는 dump.txt 파일에 출력하도록 .output 명령을 실행한다. 이 명령을 실행하면 .dump 명령뿐만 아니라 SELECT 문 등의 실행 결과도 모두 화면이 아닌 파일에 기록된다.
.output ./dump.txt
sqlite> .output ./dump.txt
sqlite>
출력이 현재 디렉터리에 있는 dump.txt로 되도록 변경되었다. 다음은 .dump 명령을 실행다.
.dump
sqlite> .dump
sqlite>
덤프한 결과는 화면이 이닌 파일에 출력되기에 화면에 아무것도 표시되지 않는다.
현재 디렉터리를 확인 해보면 dump.txt라는 파일이 새로 생성되어 있다.
$ ls -al
total 5056
drwxr-xr-x@ 8 kimkc staff 272 11 4 01:24 .
drwxr-xr-x 9 kimkc staff 306 10 17 23:49 ..
drwxr-xr-x 24 kimkc staff 816 11 4 01:24 bak
-rw-r--r-- 1 kimkc staff 16384 11 4 01:14 dump.sqlite3
-rw-r--r-- 1 kimkc staff 538 11 4 01:21 dump.txt
-rwxr-xr-x@ 1 kimkc staff 691768 10 11 18:31 sqldiff
-rwxr-xr-x@ 1 kimkc staff 1152260 10 11 18:32 sqlite3
-rwxr-xr-x@ 1 kimkc staff 719796 10 11 18:31 sqlite3_analyzer
$
dump.txt 파일은 텍스트 파일이므로 파일을 열어보면, 덤프한 결과가 파일에 기록되어 있는 것을 확인할 수 있다.
$ cat dump.txt
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE user (name text, old integer, address text);
INSERT INTO user VALUES('devkuma',28,'Seoul');
INSERT INTO user VALUES('kimkc',22,'Busan');
INSERT INTO user VALUES('araikuma',32,'Seoul');
INSERT INTO user VALUES('happykuma',23,'Seoul');
INSERT INTO user VALUES('mykuma',23,'Daejeon');
CREATE TABLE color (id integer, name text);
INSERT INTO color VALUES(1,'Red');
INSERT INTO color VALUES(2,'Blue');
INSERT INTO color VALUES(3,'White');
CREATE INDEX nameindex on user (name);
COMMIT;
$
마지막으로 출력이 파일이 아닌 화면에 되도록 다시 되돌린다. 그러기 위해 인수에 stdout을 지정하여 .output 명령을 실행한다.
.output stdout
sqlite> .output stdout
sqlite>
파일을 출력할 때 파일이 읽기 전용으로 밖에 열 수 없는 경우에는 출력이 파일이 아닌 화면으로 되도록 다시 되돌리거나 커멘드 라인 도구를 종료하면 읽기 전용이 풀린다.