** 더 좋은 방법이 있는 지도 모른다. 그냥, 내 나름대로의 생각에 기반해서 알아낸 방법을 정리했을 뿐.
이 글은, WordPress 를 한 서버에서 다른 서버로 옮기는 방법에 대해서 설명한다.
단, 도메인명/IP 는 변경되지 않는다는 전제가 깔려있다. 도메인명이 바뀌어도, 크게 어려울 일은 없다.
(이 글을 쓰던 도중, 연습한답시고 실수로 이 워드프레스 DB 를 홀랑 날려버렸다. 다행히 복사본을 만든 후에 그랬던 지라 마치 아무 일도 없었단 듯이 복구를 하긴 했는데..
만일 그냥 홀랑 날렸다면.. 생각만으로도 짜증이 벌컥 벌컥 난다.)
이 글은 여기 저기서 도움을 받았는데..
- Stack Overflow: How to export and import a .sql file from command line with options?
- Stack Overflow: How do you use MySQL’s source command to import large files in windows
MS 윈도우 환경에서 mysql 사용에 대한 질문/답변이긴 하지만, mysql
명령을 이용하면 어차피 방법은 같으니 아무런 관계는 없다.
시작 전, mysql 사용자와 DB명 확인
WordPress 는 mysql 에 사용자와 DB 를 저장해두고, 그 정보로 블로그를 운영한다. WordPress 를 맨 처음 설치할 때 이 정보를 입력하게끔 되어 있는데, 이 정보를 기억하고 있다면 별 문제될게 없지만, 잊었다면 다음 명령으로 확인할 수 있다.
먼저 사용자명.
$ sudo mysql MariaDB [(none)]> select host, user, password from mysql.user;
다음, DB 명.
$ sudo mysql MariaDB [(none)]> show databases;
이렇게 확인한(알아낸) 사용자명과 DB명으로 아래에서 ‘데이터 추출’을 진행한다.
데이터의 종류?
WordPress 에서 데이터는 두종류, 아니 크게 세종류로 나눌 수 있다.
먼저 제일 중요한 글. 글은 Mysql 에 DB 로 저장되어 있다. 따라서 추출하려면 간단히 ‘복사’, ‘붙이기’로는 되지 않는다. 아래 추출/복원 작업을 거쳐야 한다.
두번째, 그림(등등의 미디어 파일). 그림은 WordPress 디렉토리 산하에 저장되어 있다. 따라서 그냥 복사가 가능하다.
세번째, WordPress 의 뼈대. 즉, /var/www/wordpress
디렉토리. 그림도 이 디렉토리 아래에 저장되어 있다. 역시 그냥 복사하면 된다.
결국, 보관을 하려면 /var/www/wordpress 디렉토리와, mysql DB 가 필요하다. 디렉토리는 그대로 압축(tar.gz)하여 저장하면 되지만, DB 는, 그리 하기가 애매하다. 위치는 /etc/lib/mysql 인데, 이 파일을 그대로 다른 서버로 복사/붙이기 할 수 있는지 없는지 여부를 떠나서, 설령 된다하더라도 다른 여러 문제가 생겨버릴 가능성이 높다. (나 혼자 쓰는 서버라면 또 모르지만, 공용이라면 다른 DB 까지 몽땅 지워져 버리므로.)
이 정도 배경지식을 가지고, 이제 꽃삽질을 시작해본다.
데이터 추출(DB Export)
먼저, WordPress DB에서 데이터를 내보내는 작업을 정리한다. (이 작업을 crontab 으로 일정 기간 간격으로 하게끔 해도 좋다.)
여기에도 몇가지 방법이 있는데, mysqldump 를 쓰는게 가장 간편하다. phpMyAdmin 에도 이 기능이 있는데, Export 는 별 무리없이 되지만, Import 에서 문제가 발생할 소지가 있다(SQL 파일의 용량이 일정 크기 이상이면 오류가 발생한다). 따라서, 그냥 CLI 를 이용하는 편이 좋겠다.
먼저, WordPress DB 관리자명/비밀번호와 사용 중인 테이블명을 알아야 한다.
관리자명/비밀번호는 WordPress 최초 설치 시에 지정한 것을 기억하고 있어야 하고(사실 그 때 처음 쓰고 그 뒤엔 쓸 일이 거의 없다.), 사용 중인 테이블명은 mysql 에 접속해서 알아낼 수 있다.
그러나..
이 모든 정보가 평문으로 한 파일에 고스란히 담겨있다. 바로, wp-config.php
파일이다.
하여 WordPress 에서는 이 파일의 허가권(Permission, 이 단어의 번역은 ‘권한’ 보다는 ‘허가권’이 맞지 않으려나?)을 400
으로 하라고 한다. 그럼 소유자도 수정을 못한단 얘긴데? 물론, 정 수정이 필요할 땐 변경을 한 뒤 작업하면 되겠지만.
아무튼, 정보가 기억이 나지 않을 때는 저 파일을 살펴보라!
DB 를 평문 sql 구문으로 출력하려면, 이렇게 해준다.
mysqldump -u사용자명 -p비밀번호 DB명 --events --triggers --routines > 적당한 이름.sql
여기에 쓰이는 사용자명, 비밀번호, DB는 WordPress 의 사용자/비밀번호/DB 이다.
비밀번호는 -p 뒤에 붙여넣지 말고 그냥 빈칸으로 남겨둔 뒤, 비밀번호를 묻는 프롬프트에 넣어도 된다.
또는, root(또는 sudo)를 이용해도 된다.
# mysql root 사용 $ mysqldump -uroot -p DB명 --events --triggers --routines > 적당한 이름.sql # sudo mysql 사용 $ sudo mysqldump DB명 --events --triggers --routines > 적당한 이름.sql
이러면 sql 파일이 생성된다. 이 파일은 순수한(?) Text 파일로, 아무 편집기로나 읽고 쓸 수 있다.
만약, 도메인명이 바뀌었다면, 이 sql 파일을 직접 수정해주면 된다.
예를 들어 www.xabcdz.com 에서 www.pqrt.net 으로 변경되었다면, 저 sql 파일을 적절한 편집기로 열고(또는 sed 를 사용), 해당 부분을 모두 ‘바꾸기’를 통해 작업하면 된다.
sql 파일이 상당히 크다면, 편집기보다는, sed 가 편리할 듯 하다.
WordPress 파일 원상 복구(복사)
DB 는 저렇게 해서 저장했는데, WordPress 의 뼈대를 이루는 /var/www/wordpress
는 어떻게 해줘야 하나?
워드프레스 홈페이지에서 파일을 새로 받아 설치를 한다면, 이전에 구축해놓은 각종 플러그인도 모두 따로 받아야 한다. 올려놓았던 미디어(그림/음악/영상) 파일들도 모두 다시 올려야 한다.
만약, 기존 파일들이 그대로 있다면, 그 파일들을 그대로 새 위치에 복사해주면 된다.
# 원본 파일 압축 $ sudo tar czf wordpress-190710.tar.gz /var/www/wordpress
압축 파일을 새 서버로 옮긴 후, 압축 해제하여 적절한 디렉토리로 복사한다.
복사한 후에는 소유권, 허가권등을 상황에 맞게 설정해줘야 한다.
만약, 원본이 없다면 새로 받아 설치하는 수밖에 없는데.. 이렇게 됐을 때 DB 를 복원한다면 과연 원활히 작동할런지에 대해선..??
특히 테마 문제로 인해 뭔가 문제가 발생할 수도 있을 법한데, 그래도 헤쳐나갈 순 있겠지? 그래도 가장 중요한 ‘글’들은 보존이 되어 있으니.
WordPress DB 생성
위에서 WordPress DB 를 sql 구문으로 저장해놓았으므로, 이걸 다시 DB 로 되돌려야 한다. 그러기 위해선 먼저 DB(Table)가 필요하다.
집으로 비유해보자면, sql 구문은 가구및 각종 가재도구라 할 수 있고, DB, 즉 Table 은 집(건물)이라 할 수 있다. 살림살이를 모두 빼돌렸으니(?), 채워 넣을 공간이 필요하지 않겠는가.
WordPress 최초 설치하는 방식 그대로를 따라가도 되겠지만, 이미 기존에 사용하던 모든 파일이 남아있으므로, 굳이 그 작업을 다시 할 필요는 없다. (그렇게 하자면 새로 내려받은 WordPress 파일로 설치 작업을 시행하고, 그 뒤에 기존 WordPress 파일을 덮어씌우는 작업을 해야하므로, 이중 작업이 된다.)
따라서, 단순히 DB 를 만들어 주고, 그 안을 sql 로 채워주면 되겠다.
DB 생성은 역시 mysql 명령을 사용한다.
$ sudo mysql ... MariaDB [(none)]> create user '사용자명'@'localhost' identified by '비밀번호'; MariaDB [(none)]> create database if not exists WordPressDB; MariaDB [(none)]> grant all privileges on WordPressDB.* to '사용자명'@'localhost' identified by '비밀번호'; MariaDB [(none)]> FLUSH PRIVILEGES;
여기에 쓰인 사용자명/비밀번호/DB 는, 위에서 mysqldump 에 사용했던 바로 그 정보들을 동일하게 사용해야 한다.
데이터(WordPress DB) 복원(Import)
mysqldump 로 추출해낸 DB 를, 이제 다시 붙여넣는다.
같은 기능을 수행하는 두가지 방법이 있는데, 하나는 mysql 명령 자체를 이용하고, 다른 하나는 mysql 내부 명령어 source
를 사용한다.
위 Stackoverflow 의 rightstuff 님의 의견에 따르면, source 명령은 크기가 작은 sql 문에 적합하지, 큰 명령 처리에는 문제가 있다고 한다.
따라서, 그냥 mysql 명령에서 처리하는 방식을 사용하기로 한다. (그래도 사용법은 정리했다.)
다만, mysql 로 했을 때는 만약 오류가 발생해도 화면에 출력이 되지 않는 듯 하다. 이 부분에 대한 처리는 어찌해야 할 지 모르겠다.
source 를 사용하면, 뭔가 주저리 주저리 출력되기 때문에, 쉽게 알아볼 수 있다는 장점이 있다.
mysql -u사용자명 -p비밀번호 DB명 < xxx.sql
다시 말하지만, 사용자명/비밀번호/DB명은 모두 위에서 사용한 것과 동일하다.
source 를 사용하려면, 일단 xxx.sql 파일이 있는 디렉토리로 이동하고(이게 편하다. 아니명 경로를 모두 입력해줘야 한다.), 다음 순서를 따른다.
$ mysql -u사용자명 -p비밀번호 DB명 ... MariaDB [DB명]> source xxx.sql
MariaDB 프롬프트에 [DB명] 이 제대로 표기되었는지 확인한 후 진행한다.
작업완료.
웹브라우저로 접속하여 작동이 원활한지 확인하는 일만 남았다.
생각보다 간단?