MySQL 5.7 설치와 자료 이전
예전에는 한 번 MySQL 5.6 에서 MySQL 5.6으로 옮기는 경우였는데, 그 때에는 옛서버에서 mysql data folder (예를 들어 /var/db/msyql) 전체를 서버에서 서버 문서 복사해서 새로운 서버에서 mysql을 설치해서 기동하면 아주 자연스럽게 돌아갔다.
이번에는 좀 더 일반적인 방법[(사실 예전 방식을 시도 안해본 것은 아니지만, 이유를 알 수 없는 이유로 한 번은 되었다가 또 한 번은 안 되고, 결국 가장 안전한 방법으로 자료이전을 하기로 한다)]으로 새 서버에 MySQL을 새로 설치하고, 그 관련 자료를 예전 서버로부터 이전해 보려고 한다.
옛 서버 쪽: MySQL 5.6 판, 이미 돌아가고 있음
mysqldump -u root -p --databases db1 db2 db3 > /home/dump.sql
혹은,
mysqldump -u root -p –all-databases > /home/dump.sql
새 서버 쪽: MySQL 5.7 판, 설치한 후에 돌려야 함
cd /usr/ports/database/mysql57-server
make config
make all install clean
설치한 다음에 나오는 중요한 정보
On install:
Initial password for first time use of MySQL is saved in $HOME/.mysql_secret
ie. when you want to use "mysql -u root -p" first you should see password
in /root/.mysql_secret
MySQL57 has a default /usr/local/etc/mysql/my.cnf,
remember to replace it wit your own
or set `mysql_optfile="$YOUR_CNF_FILE` in rc.conf.
On upgrade:
Remember to run mysql_upgrade the first time you start the MySQL server
after an upgrade from an earlier version.
설치후에 나오는 이 중요한 정보는 'pkg info -D -x pkgname (예로 mysql57-server)'하면 다시 볼 수 있다.
여기서 정말 중요한 정보는 설정문서에 대한 정보다.
/usr/local/etc/mysql/my.cnf
여기에서 datadir=/var/db/mysql 위치를 다른 공간으로, 예를 들면 /mydir/mysql로 변경하려면, 이 '/var/db/mysql'을 다 찾아서 '/mydir/mysql'로 바꿔주면 된다[(vi 에디터에서는 ':%s/\/var\/db\/mysql/\/mydir\/mysql/g' 하면 된다.)]. 아래 설명에서는 기본값인 /var/db/mysql 로 설정한 예를 보여준다.
설치한 다음에 딸려서 설치된 패키지들 청소한 화면
===> Cleaning for bison-3.6.4,1
===> Cleaning for m4-1.4.18_1,1
===> Cleaning for texinfo-6.7_4,1
===> Cleaning for help2man-1.47.16
===> Cleaning for p5-Locale-gettext-1.07
===> Cleaning for gettext-tools-0.21
===> Cleaning for libtextstyle-0.21
===> Cleaning for gmake-4.3_2
===> Cleaning for p5-Locale-libintl-1.32
===> Cleaning for p5-Text-Unidecode-1.30
===> Cleaning for p5-Unicode-EastAsianWidth-12.0
===> Cleaning for cmake-3.19.2
===> Cleaning for py37-sphinx-3.3.1,1
===> Cleaning for py37-setuptools-44.0.0
===> Cleaning for py27-setuptools-44.0.0
===> Cleaning for py38-setuptools-44.0.0
===> Cleaning for py39-setuptools-44.0.0
===> Cleaning for py36-setuptools-44.0.0
===> Cleaning for python37-3.7.9_1
===> Cleaning for libffi-3.3_1
===> Cleaning for py37-sphinxcontrib-applehelp-1.0.2
===> Cleaning for py37-sphinxcontrib-devhelp-1.0.2
===> Cleaning for py37-sphinxcontrib-jsmath-1.0.1
===> Cleaning for py37-sphinxcontrib-htmlhelp-1.0.3
===> Cleaning for py37-sphinxcontrib-serializinghtml-1.1.4
===> Cleaning for py37-sphinxcontrib-qthelp-1.0.3
===> Cleaning for py37-Jinja2-2.11.2_1
===> Cleaning for py27-Jinja2-2.11.2_1
===> Cleaning for py37-markupsafe-1.1.1_1
===> Cleaning for py27-markupsafe-1.1.1_1
===> Cleaning for py37-Babel-2.8.0
===> Cleaning for py27-Babel-2.8.0
===> Cleaning for py37-pytz-2020.1,1
===> Cleaning for py27-pytz-2020.1,1
===> Cleaning for py37-pygments-2.7.2
===> Cleaning for py37-docutils-0.15.2
===> Cleaning for py27-docutils-0.15.2
===> Cleaning for py37-snowballstemmer-1.2.1
===> Cleaning for py27-snowballstemmer-1.2.1
===> Cleaning for py37-pystemmer-2.0.0.1
===> Cleaning for py27-pystemmer-2.0.0.1
===> Cleaning for py37-cython-0.29.21
===> Cleaning for py27-cython-0.29.21
===> Cleaning for py38-cython-0.29.21
===> Cleaning for py39-cython-0.29.21
===> Cleaning for py36-cython-0.29.21
===> Cleaning for py37-alabaster-0.7.6
===> Cleaning for py27-alabaster-0.7.6
===> Cleaning for py37-imagesize-1.1.0
===> Cleaning for py27-imagesize-1.1.0
===> Cleaning for py37-requests-2.22.0_2
===> Cleaning for py27-requests-2.22.0_2
===> Cleaning for py37-certifi-2020.12.5
===> Cleaning for py27-certifi-2020.12.5
===> Cleaning for py37-chardet-3.0.4_3
===> Cleaning for py27-chardet-3.0.4_3
===> Cleaning for py37-idna-2.10
===> Cleaning for py27-idna-2.10
===> Cleaning for py37-urllib3-1.25.11,1
===> Cleaning for py27-urllib3-1.25.11,1
===> Cleaning for py37-pysocks-1.7.1
===> Cleaning for py27-pysocks-1.7.1
===> Cleaning for py37-cryptography-2.9.2
===> Cleaning for py27-cryptography-2.9.2
===> Cleaning for py37-cffi-1.14.4
===> Cleaning for py27-cffi-1.14.4
===> Cleaning for py37-pycparser-2.20
===> Cleaning for py27-pycparser-2.20
===> Cleaning for py37-six-1.15.0
===> Cleaning for py27-six-1.15.0
===> Cleaning for py37-openssl-19.1.0
===> Cleaning for py27-openssl-19.1.0
===> Cleaning for py37-packaging-20.8
===> Cleaning for py27-packaging-20.8
===> Cleaning for py37-pyparsing-2.4.7
===> Cleaning for py27-pyparsing-2.4.7
===> Cleaning for jsoncpp-1.9.4
===> Cleaning for meson-0.56.0
===> Cleaning for ninja-1.10.2,2
===> Cleaning for libuv-1.40.0
===> Cleaning for autoconf-2.69_3
===> Cleaning for autoconf-wrapper-20131203
===> Cleaning for automake-1.16.3
===> Cleaning for libtool-2.4.6_1
===> Cleaning for rhash-1.4.0
===> Cleaning for libarchive-3.4.3,1
===> Cleaning for lzo2-2.10_1
===> Cleaning for protobuf-3.13.0,1
===> Cleaning for libedit-3.1.20191231,1
===> Cleaning for mysql57-client-5.7.32
===> Cleaning for openldap-sasl-client-2.4.56
===> Cleaning for cyrus-sasl-2.1.27_1
===> Cleaning for mysql57-server-5.7.32
/etc/rc.conf 내용 [(db 폴더 위치는 기본값을 썼다., 이 위치를 변경하고 싶다면 /usr/local/etc/mysql/my.cnf 내용을 변경하면 된다.)]. 5.7 판수에서 중요한 변화는 MySQL 환경변수를 지정하는 설정문서가 만들어져 있다는 거다.
##########
# MySQL
mysql_enable="YES"
자료초기화하고 MySQL 기동한 후에 자료를 이전한다. 초기화를 할 때 root 비밀번호가 임시로 만들어 진다.
/usr/local/libexec/mysqld --initialize --user=mysql --datadir=/var/db/mysql
100
100 200
100 200
[Warning] InnoDB: New log files created, LSN=45790
100
[Warning] InnoDB: Creating foreign key constraint system tables.
mysqld: Error on delete of './auto.cnf' (Errcode: 2 - No such file or directory)
[Warning] World-writable config file './auto.cnf' has been removed.
[Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: 0ca0253b-4ee1-11eb-b0ab-0125907bb316.
[Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
[Warning] CA certificate ca.pem is self signed.
[Note] A temporary password is generated for root@localhost: hphj!CFAp4>r
자료초기화가 성공적으로 끝나면 다음을 실행한다. 명령어 끝에 '&' 빼먹지 말자!
mysqld_safe --user=mysql --datadir=/var/db/mysql &
서버 기동을 확인하였으면 임시로 받은 root 비밀번호를 본인이 기억하기 쉬운 것으로 바꾸어주면 좋다. 그러고 나서 다음과 같은 명령어로 옛 서버에 있는 자료를 새 서버로 옮겼다. 새로 설치를 하는 경우에는 이런 이전을 할 필요가 없다.
mysql -u root -p < /mnt/dump.sql
그런 다음에 사용자는 다음과 같은 방식으로 일일이 새로 더해주었다[(내 경우에는 사용자 정보를 저장하고 있는 mysql db는 이전하지 않았다)].
msyql -u root -p
use mysql;
create user 'myuser1'@'localhost' identified by 'topseceret';
grant all privileges on mydb1.* to 'myuser1'@'localhost';
flush privileges;
exit;
모든 게 잘 되면 좋지만 잘 안되는 경우를 위해서 참고적으로 두 가지를 더 알아두니 좋았다.
MySQL root 비번 번경 방법
MySQL 데몬 죽이는 법