카테고리 보관물: Linux

분실한 mysql root password 재설정하기

Mysql을 처음 설치할 때 database root 계정으로 사용할 password를 설정한다. 하지만 시간이 오래 지나서 그때 설정한 password를 기억할 수 없다면 다음의 방법으로 재설정할 수 있다. (Ubuntu 12.04 기준)

Step 1. 실행중인 mysql service를 중지 시킨다.

# service mysql stop

Step 2. Password를 검사하지 않도록 mysql 환경설정 파일을 수정한다.
: /etc/mysql/my.conf file에 skip-grant-tables를 추가하면 password를 검사하지 않는다.

[mysqld]
#
# * Basic Settings
#
user         = mysql
pid-file     = /var/run/mysqld/mysqld.pid
socket       = /var/run/mysqld/mysqld.sock
port         = 3306
basedir      = /usr
datadir      = /var/lib/mysql
tmpdir       = /tmp
lc-messages-dir = /usr/share/mysql

skip-external-locking

skip-grant-tables

Step 3. 새로운 설정 값으로 mysql service를 실행한다.

# sudo service mysql start

Step 4. root 계정으로 mysql database를 연다.

$ mysql -uroot mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 37
Server version: 5.5.29-0ubuntu0.12.04.1 (Ubuntu)

Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

Step 5. root password를 재설정한다.

mysql> UPDATE user SET password=PASSWORD('ROOT_비밀번호') WHERE user='root';
Query OK, 4 rows affected (0.00 sec)
Rows matched: 4  Changed: 4  Warnings: 0

Step 6. my.conf를 복원하고 mysql service를 재실행 시킨다. 

cannot open shared object file: No such file or directory

64bit ubuntu에서 locate 등의 명령어로 찾아보면 library가 있으나 실제로는 수행할 때 찾을 수 없다는 오류를 내면서 죽는 경우가 있다. 아래는 android build 중에 수행되는 어떤 실행 파일이 libQtGui.so.4를 찾지 못해 종료한 빌드 로그이다.

...
./bin/EXE_FILE: error while loading shared libraries: libQtGui.so.4: cannot open shared object file: No such file or directory
...

하지만 찾아보면 libQtGui.so.4는 정상적으로 있다.

HOME$ locate libQtGui.so.4
/usr/lib/x86_64-linux-gnu/libQtGui.so.4
/usr/lib/x86_64-linux-gnu/libQtGui.so.4.8
/usr/lib/x86_64-linux-gnu/libQtGui.so.4.8.1

문제는 이것들이 64bit용이고 실행파일은 32bit executable이라는 것인데 이는 file command로 알 수 있다.

EXE_FILE_PATH$ file EXE_FILE
EXE_FILE_PATH/EXE_FILE: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, BuildID[sha1]=0x39b2e75a8c8a0993f3774fa13ba55b893fa41a66, not stripped

EXE_FILE은 32bit 80386실행 파일이지만 ldd command로 검사해 보면 누락된 library들이 ‘not found’로 표시된다.

HOME$ ldd EXE_FILE_PATH/EXE_FILE
linux-gate.so.1 => (0xf7734000)
libQtGui.so.4 => not found
libQtCore.so.4 => not found
libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xf7701000)
libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0xf761c000)
libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xf75f0000)
libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xf75d2000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xf7428000)
libz.so.1 => /lib/i386-linux-gnu/libz.so.1 (0xf7411000)
/lib/ld-linux.so.2 (0xf7735000)

32bit (i386)용 library를 다음과 같이 package명 뒤에 “:i386″을 붙이면 설치 할 수 있다.

$ sudo apt-get install libqtgui4:i386

의존성 있는 library들이 함께 설치되고 다시 ldd command를 실행해 보면 모든 library들이 정상적으로 찾아 지는 것을 볼 수 있다.

$ ldd EXE_FILE_PATH/EXE_FILE
	linux-gate.so.1 =>  (0xf776b000)
	libQtGui.so.4 => /usr/lib/i386-linux-gnu/libQtGui.so.4 (0xf6c80000)
	libQtCore.so.4 => /usr/lib/i386-linux-gnu/libQtCore.so.4 (0xf69a3000)
	libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xf6987000)
	libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0xf68a2000)
	libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xf6876000)
	libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xf6858000)
	libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xf66ae000)
	libz.so.1 => /lib/i386-linux-gnu/libz.so.1 (0xf6697000)
	libfontconfig.so.1 => /usr/lib/i386-linux-gnu/libfontconfig.so.1 (0xf6663000)
	libaudio.so.2 => /usr/lib/i386-linux-gnu/libaudio.so.2 (0xf664a000)
	libglib-2.0.so.0 => /lib/i386-linux-gnu/libglib-2.0.so.0 (0xf6551000)
	libpng12.so.0 => /lib/i386-linux-gnu/libpng12.so.0 (0xf6527000)
	libfreetype.so.6 => /usr/lib/i386-linux-gnu/libfreetype.so.6 (0xf648c000)
	libgobject-2.0.so.0 => /usr/lib/i386-linux-gnu/libgobject-2.0.so.0 (0xf643d000)
	libSM.so.6 => /usr/lib/i386-linux-gnu/libSM.so.6 (0xf6434000)
	libICE.so.6 => /usr/lib/i386-linux-gnu/libICE.so.6 (0xf641a000)
	libXi.so.6 => /usr/lib/i386-linux-gnu/libXi.so.6 (0xf640a000)
	libXrender.so.1 => /usr/lib/i386-linux-gnu/libXrender.so.1 (0xf63ff000)
	libXext.so.6 => /usr/lib/i386-linux-gnu/libXext.so.6 (0xf63ed000)
	libX11.so.6 => /usr/lib/i386-linux-gnu/libX11.so.6 (0xf62b9000)
	libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xf62b4000)
	librt.so.1 => /lib/i386-linux-gnu/librt.so.1 (0xf62ab000)
	/lib/ld-linux.so.2 (0xf776c000)
	libexpat.so.1 => /lib/i386-linux-gnu/libexpat.so.1 (0xf6280000)
	libXt.so.6 => /usr/lib/i386-linux-gnu/libXt.so.6 (0xf6224000)
	libXau.so.6 => /usr/lib/i386-linux-gnu/libXau.so.6 (0xf6220000)
	libpcre.so.3 => /lib/i386-linux-gnu/libpcre.so.3 (0xf61e4000)
	libffi.so.6 => /usr/lib/i386-linux-gnu/libffi.so.6 (0xf61dd000)
	libuuid.so.1 => /lib/i386-linux-gnu/libuuid.so.1 (0xf61d6000)
	libxcb.so.1 => /usr/lib/i386-linux-gnu/libxcb.so.1 (0xf61b5000)
	libXdmcp.so.6 => /usr/lib/i386-linux-gnu/libXdmcp.so.6 (0xf61ae000)

 

[Tip] Hex string을 bash에서 보기

Unix command인 echo를 -e option과 함께쓰면 ‘\x’로 escape된 hex값을 문자로 보여 준다.

$ echo -e "\x5B\xEB\xAC\xBC\xEB\x86\x80\xEC\x9D\xB4\x20\xEA\xB7\xB8\xEB\xA6\xBC\xED\x8C\x90\x5D"
[물놀이 그림판]

Web browser등에서는 ‘\x’가 아닌 ‘%’를 escape character로 사용하기도 하는데 이런경우는 bash의 string 치환을 사용해서 ‘\x’로 변환해서 사용할 수 있다.

$ str='\x5B\xEB\xAC\xBC\xEB\x86\x80\xEC\x9D\xB4\x20\xEA\xB7\xB8\xEB\xA6\xBC\xED\x8C\x90\x5D'

$ echo -e ${str//%/\\x}
[물놀이 그림판]

* Bash에서 string을 다루는 방법에 대해서는 KLDP의 이 문서를 참고.