====== MySQL 5.7 설치와 자료 이전 ====== 예전에는 한 번 MySQL 5.6 에서 MySQL 5.6으로 옮기는 경우였는데, 그 때에는 옛서버에서 mysql data folder (예를 들어 /var/db/msyql) 전체를 [[freebsd:server2severcopy|서버에서 서버 문서 복사]]해서 새로운 서버에서 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 비번 번경 방법 == https://dev.mysql.com/doc/refman/5.7/en/resetting-permissions.html 참고. mysqld_safe --skip-grant-tables --datadir=/var/db/mysql & mysql [(none)]use mysql; [mysql] flush privileges; [mysql] ALTER USER 'root'@'localhost' identified by 'newtopsecret'; [mysql] flush privileges; [exit] exit == MySQL 데몬 죽이는 법 == https://superuser.com/questions/983969/how-to-kill-mysql-with-moving-pid 참고. ps aux | grep mysql 실행 결과를 보니 MySQL이 분명히 돌아가고 있는데, 무슨 pid 파일이 없다면서 MySQL 서버를 새로 시작할 수가 없었다. pkill mysql 또 한 번은 다음 명령어로 MySQL을 죽였다. killall -9 mysql killall -9 mysqld killall -9 mysqld_safe