2017년 5월 10일 수요일

MySQL 에서 [ERROR] Can't find messagefile '/usr/share/mysql/english/errmsg.sys' 발견 시 조치방법

AWS의 EC2 기반으로 CentOS 6.8을 올리고 MySQL을 설치 중이었는데, 아래와 같은 오류를 보게 되었습니다. 보통은 yum 으로 설치했을 때 문제없이 설치되었는데, 아마도 OS 설정이 조금 다른 탓인지 오류가 발생해서 찾아 보았는데요.

[MySQL 설치]
yum install mysql-server

[오류 내용]

170510 07:06:38 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
170510  7:06:38 [ERROR] Can't find messagefile '/usr/share/mysql/english/errmsg.sys'
/usr/libexec/mysqld: Unknown error 1146
170510  7:06:38 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.


조치는 아래와 같이 해 보았습니다.
1.  yum install mysql-libs
2. /usr/bin/mysql_install_db

그리고 나서 service mysqld start 를 실행하니 정상 동작되었습니다. 검색을 해보니 오류 자체는 비교적 빈번하게 발생하는 것 같은데, 조치한 분들마다 방법이 천차만별이네요. 이래서 기록이 필요한 모양입니다. :)




2017년 4월 19일 수요일

Ubuntu 16.04LTS 에서 sudo 명령이 되지 않을 때

테스트를 진행하던 도중에 무엇이 문제였는지 모르겠지만 갑자기 아래와 같은 오류가 발생했습니다. sudo 를 쓸 수가 없게 되었네요..

sudo: /usr/bin/sudo must be owned by uid 0 and have the setuid bit set

특별히 permission 을 변경하거나 다른 뭔가를 설치한 기억이 없어서 한참
검색하다가, 아래 사이트의 내용을 발견하여 시도해 보았습니다.

https://unix.stackexchange.com/questions/187672/restore-sudo-privileges

First restart the pc, press SHIFT key while Ubuntu is booting.
This will bring you up the boot menu.

Go to Advanced Options.

Select your OS version in (recovery mode), and press Enter Key.
example : Ubuntu 14.04 (recovery mode)

It will bring you up another screen. Now select “Drop to root shell prompt” and press Enter. It will load a command line at the bottom of the screen.

Now run each of the following commands.

# mount -o remount,rw /
# mount -a
# chown root:root /usr/bin/sudo
# chmod 4755 /usr/bin/sudo
# init 6

그대로 따라하니 해결되었네요. 복구는 했는데, 원인이 무엇인지는 지금도 모르겠네요. 다음에는 차근차근 기록을 좀 해야 겠습니다.


2017년 3월 29일 수요일

CentOS에서 Default Gateway 설정이 유지되지 않을 때 조치 사항


처음 블로그를 쓰겠다고 마음먹었을 때에는 개인적으로 관심있는 부분만 기록하려고 했는데, 점점 일 얘기를 쓰게 되네요. ㅡ.ㅡ; 그래도, 같은 일이 반복되어 또다시 시간 낭비하는 것 보다는 잘 기록해 놓는게 낫겠지요.

보통 Linux 에서 네트워크 설정을 하고 문제가 있을 때는 대충 조치를 했었는데,
오늘은 운영중인 시스템이라 맘대로 바꿀 수가 없었습니다. 이 시스템은 CentOS 6.7이고,구성은 아래와 같았습니다.

[root@localhost sysconfig]# netstat -rn
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt 

Iface
100.100.100.0     0.0.0.0         255.255.255.0   U         0 0          0 eth1
169.254.0.0     0.0.0.0         255.255.0.0     U         0 0          0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U         0 0          0 eth1
169.254.0.0     0.0.0.0         255.255.0.0     U         0 0          0 eth2
0.0.0.0         100.100.100.254   0.0.0.0         UG        0 0          0 eth1
[root@localhost sysconfig]# 

위와 같은 상태에서, 서버를 재시작 하면요..

[root@localhost sysconfig]# netstat -rn
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt 

Iface
100.100.100.0     0.0.0.0         255.255.255.0   U         0 0          0 eth1
169.254.0.0     0.0.0.0         255.255.0.0     U         0 0          0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U         0 0          0 eth1
169.254.0.0     0.0.0.0         255.255.0.0     U         0 0          0 eth2

위와 같이 Default Gateway가 사라져 버립니다. 이 문제를 해결해야 했지요.
우선 Default Gateway를 추가해 주면 되니, 아래 처럼 해 보았습니다.
[root@localhost network-scripts]# cat /etc/rc.d/rc.local 
#!/bin/sh

touch /var/lock/subsys/local
route add default gw 100.100.100.254 dev eth1

재부팅을 해보니까 성공인 듯 해서 좋아했는데, network service 를
재시작하니 다시 문제가 발생하네요. 원격에서 접속할 일이 있는데
이런 명령이 말을 안 들으면 큰일입니다.

그래서 검색을 해 보니, metric 으로 default gateway의 우선순위를 지정하는 방법이 있네요.
다중 Ethernet port 를 가진 서버 장비에서는 이런 설정이 있어야 되는 모양입니다.

  
[root@localhost network-scripts]# cat ifcfg-eth1
DEVICE=eth1
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=static
IPADDR=100.100.100.118
NETMASK=255.255.255.0
GATEWAY=100.100.100.254
METRIC=0       #이렇게 추가합니다.
DNS1=8.8.8.8

이후 다른 설정파일(ifcfg-eth0 ~ eth3 ) 에서 사용하지 않는 카드는 ONBOOT=no로 처리해
줍니다. 이후 다시 확인한 routing table 은 아래와 같이 보입니다.

[root@localhost network-scripts]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
100.100.100.0     0.0.0.0         255.255.255.0   U     0      0        0 eth1
169.254.0.0     0.0.0.0         255.255.0.0     U     1004   0        0 eth1
0.0.0.0         100.100.100.254   0.0.0.0         UG    0      0        0 eth1
[root@localhost network-scripts]# 
[root@localhost network-scripts]# netstat -rn
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt 

Iface
100.100.100.0     0.0.0.0         255.255.255.0   U         0 0          0 eth1
169.254.0.0     0.0.0.0         255.255.0.0     U         0 0          0 eth1
0.0.0.0         100.100.100.254   0.0.0.0         UG        0 0          0 eth1
[root@localhost network-scripts]#  

이후에는 서버 재시작을 하거나, service network restart 명령 이후에도 Default Gateway 설정이

유지되는 것을 확인할 수 있었습니다.  :)

2017년 3월 27일 월요일

mongodb 설치 및 DB 생성하기

책 내용을 실습하다 보니 mlab을 이용하여 외부에 mongodb를 설정하는
방법에 대한 설명이 있었습니다. 간단히 mongodb를 설치해서 쓰는게
나을 듯 해서 일단 몇가지 자료를 찾아보고 설치를 진행했습니다.

일단 아래의 내용을 주로 참고했습니다.
https://www.digitalocean.com/community/tutorials/how-to-install-mongodb-on-ubuntu-16-04


설치를 완료하고 mongodb에 계정 및 DB를 생성하는 내용입니다.

lockfree@ubuntu:/etc/apt$ mongo
MongoDB shell version: 3.2.12
connecting to: test
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
http://docs.mongodb.org/
Questions? Try the support group
http://groups.google.com/group/mongodb-user
Server has startup warnings:
2017-03-27T19:26:02.050+0900 I CONTROL  [initandlisten]
2017-03-27T19:26:02.051+0900 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2017-03-27T19:26:02.051+0900 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2017-03-27T19:26:02.051+0900 I CONTROL  [initandlisten]
2017-03-27T19:26:02.051+0900 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2017-03-27T19:26:02.051+0900 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2017-03-27T19:26:02.051+0900 I CONTROL  [initandlisten]
>
>
>
> ues admin
2017-03-27T19:33:19.410+0900 E QUERY    [thread1] SyntaxError: missing ; before statement @(shell):1:4

> use admin
switched to db admin
> db.createUser( {user: "admin",
... pwd: "xxxxxxx",
... roles: [ "userAdminAnyDatabase",
... "dbAdminAnyDatabase",
... "readWriteAnyDatabase"
... ]})
Successfully added user: {
"user" : "admin",
"roles" : [
"userAdminAnyDatabase",
"dbAdminAnyDatabase",
"readWriteAnyDatabase"
]
}
>
>
>
> use parsedb
switched to db parsedb
> db.createUser({ user: "lockfree",
... pwd: "xxxxxxxx",
... roles: ["dbAdmin","readWrite"]
... })
Successfully added user: { "user" : "lockfree", "roles" : [ "dbAdmin", "readWrite" ] }
>
>
> exit
bye
lockfree@ubuntu:/etc/apt$

이후 접속은 아래와 같이 할 수 있습니다.

lockfree@ubuntu:/etc/apt$ mongo parsedb --username lockfree --password xxxxxxx

그런데, 아래와 같이 오류가 발생하네요.

2017-03-27T19:26:02.050+0900 I CONTROL  [initandlisten]
2017-03-27T19:26:02.051+0900 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2017-03-27T19:26:02.051+0900 I CONTROL  [initandlisten] **        We suggest setting it to 'never'

위와 같은 경우 스크립트를 사용하는 여러가지 방법이 있는 것 같습니다.아래의
사이트를 참고해 볼 만 한것 같네요.

https://docs.mongodb.com/manual/tutorial/transparent-huge-pages/#transparent-huge-pages-thp-settings
https://ubuntuforums.org/showthread.php?t=2255151









2017년 3월 14일 화요일

Mongo script 로 index 관리하기

MongoDB로 작업할 일이 있는데, 매 번 아래처럼 작업하는 것이 조금 귀찮은 일이었습니다. 개발을 하거나 시간이 여유로운 경우라면 문제 없지만, 저처럼 고객사에 방문 작업을 할 때 이런 작업은 무엇보다 정확성에서 문제가 되거든요. 그래서 스크립트로 작업할 수 있는 방법을 찾아보았습니다.

$mongo --host 10.10.10.10:27017
> use admin
> db.auth("root", "password")
> use dbname
> db.auth("test", "test123")
> db.test.ensureIndex({"testId": 1})

위와 같이 interactive한 작업은 매번 수작업으로 입력해야 하는 부분이 많아서
반복적인 작업에는 별로 권장할 만한 것은 아니지요. 그래서 이 작업을 명령줄에서 한번에 작업하는 방법을 찾아보았습니다. --eval 옵션이나, js 파일로 만들어 작업하는 방법들이 많이 소개되고 있었는데, 저에게 적합한 방법은 아래와 같이 작성하여 사용하는 것인듯 합니다.

$mongo --host 10.10.10.10:27017 dbname --username root --password password <<< 'printjson(ensureIndex({"testId": 1})'

$mongo --host 10.10.10.10:27017 dbname --username root --password password <<< 'db.system.indexes.find();'

이제는 하나씩 정리를 해 두어야 될 때가 된것 같습니다. 자꾸 잊어버리네요 :)


2017년 3월 12일 일요일

Raspberrypi 설치하기 3 - RASPBIAN 부팅하기

 Image 굽기가 끝나서 연결을 해 보려는데, SD 카드를 어떻게 삽입했었는지 기억이 나지 않아 잠시 고민하다가.. 아 뒷면에 있다는게 기억이 났습니다. 아래 그림처럼 뒤집어서  SD카드를 삽입합니다.


그리고, 전면에 방열판을 연결해 줍니다. 과열로 인한 오동작이 있을 수 있어서 방열판은 연결해 두는 것이 제품 수명상 좋다고 하네요. 아래와 같이 동봉된 방열판의 뒷면 양면 접착 테이프 포장을 떼어낸 뒤 잘 붙여줍니다.


붙이면 이런 모양이 되겠네요.


이제 전원 케이블 , 모니터 연결을 위한 HDMI 케이블을 연결해 봅니다. 그리고,
키보드, 마우스도 연결해 봐야 겠네요.



첫화면에   Raspberry 아이콘 딸기모양이 4개 보이네요. 캡쳐는 하지 못했지만, 이것은  core 수를 나타낸다고 합니다. 놀랍게도 quad core 네요.


드디어 부팅까지 확인했습니다. 이제 학습할 준비가 되었다고 볼 수 있네요. 다음에는 인터넷 연결을 해 보고, 책에 있는대로 실습을 해 봐야 겠습니다. 이제 진짜 시작이네요 :)



Raspberrypi 설치하기 2 - RASPBIAN image 굽기

다운로드 받았던 프로그램을 모두 설치했습니다. 아래는 win32 Disk Imager의 구동화면 입니다.


여기에 다운로드 완료한 2017-03-02-raspbian-jessie  압축을 해제한  image 파일을 선택해 줍니다.  이 파일을 선택하구요. 그리고 나서 구매한  SD  card를 USB 어댑터에 삽입하여 연결합니다. 그럼 Disk Imager 가 이 USB 어댑터를 인식하고 드라이브가 할당됩니다. 저는 E:\로 보여지네요. 그리고 나면 Write 버튼을 눌러 Image를 적용합니다.





위와 같이 삽입 및 연결 후, 다시 확인해 본 win32 disk imager  화면입니다.



이제  Image가 구워지면 Raspberry Pi에 연결만 하면 사용할 수 있겠네요. 기대가 큽니다. :)





MySQL 에서 [ERROR] Can't find messagefile '/usr/share/mysql/english/errmsg.sys' 발견 시 조치방법

AWS의 EC2 기반으로 CentOS 6.8을 올리고 MySQL을 설치 중이었는데, 아래와 같은 오류를 보게 되었습니다. 보통은 yum 으로 설치했을 때 문제없이 설치되었는데, 아마도 OS 설정이 조금 다른 탓인지 오류가 발생해서 찾아 보았는데요. ...