'mysql'에 해당되는 글 4건

  1. 2014.03.27 Ubuntu GitLab 설치하기 with apache, mysql
  2. 2013.04.23 Mysql ssl 설정 & JDBC 로 SSL 통신 5
  3. 2011.10.04 MySQL 테이블명 대소문자 구분안하기
  4. 2011.08.08 MySQL : XAER_RMFAIL: The command cannot be executed when global transaction is in the ACTIVE state 에러가 날때

Ubuntu GitLab 설치하기 with apache, mysql


svn만 주구장창 써오다가 어느날 문득 시대에 너무 뒤처지는 느낌이라 git 를 써보고 싶었다. (심지어 회사에서는 cvs 를 쓴다)



그냥 개인적으로 로컬 git 리포지토리만 썼었는데 팀원이 쪼매 생기는 바람에 원격 리포지토리도 맹글 필요가 생겼졌다.



이것저것 알아봤는데 Window 용 git 서버도 있지만, 왠지 매우 있어보이는 GitLab 을 써보고 싶어서 Ubuntu 에다 설치해 보기로 했다.



먼저 기존에 Ubuntu 서버가 있으면 좋고, 아니면 컴퓨터를 하나 받아서 간지나게 전용 서버를 맹글어도 되고, 아니면 VirtualBox 에다 Ubuntu를 깔아도 된다.



설치과정중 이미 설치된 것들은 과감하게 스킵해도 될것같다.


설치할때 참고한 URL

공식 설치 가이드 : https://github.com/gitlabhq/gitlabhq/blob/master/doc/install/installation.md

웹D 라는 분의 훌로구 : http://webdir.tistory.com/224‎


설치한 Ubuntu 버전 : Ubuntu 12.04.4 LTS





뭐 내용은 참고한 URL에 있는 내용과 거의 비슷하다.


단지 나는 개인적인 여건상 git.example.com 과 같이 간지나는 URL 을 쓸 수가 없어서 


www.example.com/git 요런식으로 기존 도메인의 서브 디렉토리로 접근할 수 있도록 하는점만 다를뿐이다.


사실 이것 때문에 살짝 삽질을 많이 하긴 했다.


아무튼 설치하는게 apt-get install 요렇게 딸랑하는 설치에 비교하면 무척 번거롭지만 설치해볼만한 가치는 있을것 같다.


자연스럽게 통합된 Git Server + Issue + Wiki 를 가질 수 있게된다.






최신 상태로 패키지 업데이트(해도 별로 손해 볼건 없을것 같으니까 일단 함)

sudo apt-get update -y
sudo apt-get upgrade -y





설치과정에 필요한 패키지 설치

sudo apt-get install -y build-essential zlib1g-dev libyaml-dev libssl-dev libgdbm-dev libreadline-dev libncurses5-dev libffi-dev curl openssh-server redis-server checkinstall libxml2-dev libxslt-dev libcurl4-openssl-dev libicu-dev logrotate






Git 설치

# Git 버전은 1.7.10 이상 버전이 설치되야 한다고 한다.
# Ubuntu 에서 그냥 쌩으로 apt-get 으로 설치하면 1.7.9 버전이 설치된다.
# 혹시 최신버전이 설치되 있을 수 있을 수 있으니까 git --version 으로 한번 확인해 보고 없으면 아래 과정을 따라하면 된다.

# ppa 추가
# add-apt-repository 명령을 한번 해보고 없으면 python-software-properties 추가 설치 후 수행

sudo apt-get install -y python-software-properties
sudo add-apt-repository ppa:git-core/ppa
sudo apt-get update

# git 설치
sudo apt-get install -y git-core






루비 설치

# git 과 마찬가지로 apt-get 으로 ruby 를 설치하면 옛날 후진버전으로 설치가 된다.
# rvm 같은 걸로 최신버전을 손쉽게 설치할 수 있지만 공식문서에서는 rvm 으로 설치하는걸 별로 추천하지는 않았다.
# 루비 최신 소스를 내려받아서 컴파일 해서 설치하기
# 루비 최신 버전은 ftp://ftp.ruby-lang.org/pub/ruby/ 요기가서 보면 확인할 수 있다. 
# 최신 버전에 맞게 아래 url을 적당하 바꿔서 설치하면 된다.

mkdir /tmp/ruby && cd /tmp/ruby
curl --progress ftp://ftp.ruby-lang.org/pub/ruby/2.1/ruby-2.1.1.tar.gz | tar xz
cd ruby-2.1.1
./configure --disable-install-rdoc

#쪼매 시간이 걸린다.
make
sudo make install

sudo gem install bundler --no-ri --no-rdoc







사용자 추가

# 왠만하면 사용자 이름은 git 으로 하길 바란다. 설정 파일들 보니까 git 이 아니면 상당히 설치하기가 힘들어 질것같다.
sudo adduser --disabled-login --gecos 'GitLab' git






GitLab Shell 설치

# 대충 보니까 GitLab WebUI 에서 요걸 호출해서 뭘 하는것 같다. 설치하자.
# https://gitlab.com/gitlab-org/gitlab-shell 에 가보면 최신버전을 확인할 수 있다.
# 최신버전 확인 후 아래 url 들을 눈치껏 적당히 바꿔주면 된다.

cd /home/git/
sudo -u git -H git clone https://gitlab.com/gitlab-org/gitlab-shell.git -b v1.9.1
cd /home/git/gitlab-shell


# 설정
sudo -u git -H cp config.yml.example config.yml

# 요파일에서 gitlab_url 어쩌고 하는 부분을 찾아 접속할 url을 써주면 된다.
# ex) gitlab_url: "http://stove99.tistory.com/git"  도메인이 없으면 http://127.0.0.1/git 요런식으로 ip로 해도 상관없다.
sudo -u git -H vi config.yml


# GitLab Shell 설치
sudo -u git -H ./bin/install







mysql 설치

# 기존에 mysql 이 설치되 있다면 넘어가도 좋지만 
# mysql-client 요거랑 libmysqlclient-dev 요거는 설치 안됐을 수도 있으니깐 꼭설치!
# 나는 기존에 mysql 이 설치되 있어서 과감히 뛰어넘었지만 
# mysql-client, libmysqlclient-dev 요거 설치안하는 바람에 뒤 과정에서 에러나서 삽질했음
# mysql 설치중 설정할 root 비밀번호 물어보는데 적당한 걸로 설정하면 됨.
sudo apt-get install -y mysql-server mysql-client libmysqlclient-dev

#설치 완료후 mysql 접속
mysql -u root -p

# USER 생성
CREATE USER 'git'@'localhost' IDENTIFIED BY '원하는 비밀번호';

# DB 생성
CREATE DATABASE IF NOT EXISTS `gitlabhq_production` DEFAULT CHARACTER SET `utf8` COLLATE `utf8_unicode_ci`;

# DB 권한 설정
GRANT SELECT, LOCK TABLES, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER 
           ON `gitlabhq_production`.* TO 'git'@'localhost';

exit

# 방금 추가한 mysql 계정 접속 쪽바로 잘되나 확인
sudo -u git -H mysql -u git -p -D gitlabhq_production

exit





GitLab 설치

# GitLab-shell 과 마찬가지로 
# https://gitlab.com/gitlab-org/gitlab-ce.git 요기가서 최신버전 확인해서 URL 눈치껏 바꿔준다.
# 현재 최신버전은 6.7.2
cd /home/git
sudo -u git -H git clone https://gitlab.com/gitlab-org/gitlab-ce.git -b 6-7-stable gitlab
cd /home/git/gitlab

#설정(할게 쫌 됨)
sudo -u git -H cp config/gitlab.yml.example config/gitlab.yml

# which git 으로 git 위치 확인
# host: localhost => host: stove99.tistory.com  (자신의 환경에 맞게 도메인이나 ip로 변경)
# relative_url_root: /gitlab 주석 제거 후 
# relative_url_root: /git 로 변경 (나는 stove99.tistory.com/git 으로 접속하고 싶으니깐)
# git:  아래쪽 bin_path: /usr/bin/git   이 which git 해서 알아낸 설치경로랑 똑같은지 확인
sudo -u git -H vi config/gitlab.yml


# ENV['RAILS_RELATIVE_URL_ROOT'] = "/gitlab" 주석해제 후 
# ENV['RAILS_RELATIVE_URL_ROOT'] = "/git" 으로 변경
# listen 어쩌고 하는 두줄 주석처리 후 listen "127.0.0.1:9292"
# 9292 는 내가 해본거고 다른포트 쓸려면 다른포트 적어주면 됨.
sudo -u git -H cp config/unicorn.rb.example config/unicorn.rb


# config.relative_url_root = "/gitlab" 주석제거 후
# config.relative_url_root = "/git" 로 변경
sudo -u git vi config/application.rb


sudo -u git -H cp config/initializers/rack_attack.rb.example config/initializers/rack_attack.rb


# 기타 잡다구리 설정
sudo -u git -H mkdir /home/git/gitlab-satellites

sudo -u git -H mkdir tmp/pids/
sudo -u git -H mkdir tmp/sockets/
sudo chmod -R u+rwX  tmp/pids/
sudo chmod -R u+rwX  tmp/sockets/
sudo -u git -H mkdir public/uploads
sudo chmod -R u+rwX  public/uploads

sudo -u git -H git config --global user.name "Stove"
sudo -u git -H git config --global user.email "stove@naver.com"
sudo -u git -H git config --global core.autocrlf input





mysql 접속설정 및 초기 데이터 입력

sudo -u git cp config/database.yml.mysql config/database.yml

# production: 아래에 password: "비밀번호" 설정
# 비밀번호는 mysql 에서 새로 추가한 git 계정 비밀번호를 적어주면 된다.
sudo -u git vi config/database.yml

sudo -u git -H chmod o-rwx config/database.yml

# 시간 살짝 걸림
sudo -u git -H bundle install --deployment --without development test postgres aws


# 초기 데이터 입력
# 명령어 입력하면 뭐라고 물어보는데 yes 입력 후 엔터치면 됨.
sudo -u git -H bundle exec rake gitlab:setup RAILS_ENV=production





GitLab 서비스 등록및 시작후로그램 추가

# service gitlab start 요래 하기 위한 스크립트 생성
sudo cp lib/support/init.d/gitlab /etc/init.d/gitlab

# 시작할때 start 되도록 처리
sudo update-rc.d gitlab defaults 21

# 뭐하는건진 잘 모름 기냥 했음.
sudo cp lib/support/logrotate/gitlab /etc/logrotate.d/gitlab






설정이 쪽바로 됐나 확인(url, git path 같은거 맞는지 확인)

sudo -u git -H bundle exec rake gitlab:env:info RAILS_ENV=production






GitLab 서비스 시작

sudo service gitlab start






Compile assets (뭐하는건지 잘 모름, 있길래 그냥 했음)

sudo -u git -H bundle exec rake assets:precompile RAILS_ENV=production






여기까지하면 일단 GitLab 설치는 다 했다.

이제 아파치랑 연동해서 웹으로 접근할 수 있도록 해야 한다.



아파치 설치 안돼 있으면 설치

sudo apt-get install apache




passenger 설치(자바로 치면 mod_jk 같은거 같다)

sudo apt-get install apache2-prefork-dev libapr1-dev libaprutil1-dev

sudo gem install passenger --no-rdoc --no-ri

# 아래 명령어 입력하면 뭐 물어보는거 같긴한데 내 경우 화면이 깨져서 뭔소린지 몰르겠다.
# 그냥 계속 엔터 치면 된다.
# 컴파일 끝나고 스크롤 살짝 올려보면 어째어째 설정하라고 설명으로 알려줌
# 여기서 which ruby 로 ruby 경로 알아내서 PassengerRuby 부분에 있는 경로랑 같은지 확인바람
sudo passenger-install-apache2-module


# passenger 모듈 apache에 추가
sudo vi /etc/apache2/mods-available/passenger.load

#파일내용(자신의 경로에 맞는지 확인 바람, 위에서 설명한대로 passenger 설치과정에서 요런거 다 알려줌.)
LoadModule passenger_module /usr/local/lib/ruby/gems/2.1.0/gems/passenger-4.0.40/buildout/apache2/mod_passenger.so
<IfModule mod_passenger.c>
    PassengerRoot /usr/local/lib/ruby/gems/2.1.0/gems/passenger-4.0.40
    PassengerDefaultRuby /usr/local/bin/ruby
</IfModule>


#저장후 모듈 enable
sudo a2enmod passenger






proxy, proxy_http  mod 활성화

sudo a2enmod proxy
sudo a2enmod proxy_http







gitlab 사이트 등록

sudo ln -s /home/git/gitlab/public/ /var/www/git

sudo vi /etc/apache2/sites-available/git

# 파일내용
ProxyPass /git/uploads !     #아바타 이미지 나오게 /git/uploads 요청은 apache에서 처리
<Location /git/>
    ProxyPass http://127.0.0.1:9292/git/
    ProxyPassReverse http://127.0.0.1:9292/git/
</Location>





site 활성화

sudo a2ensite git





apache restart

sudo service apache2 restart





마지막으로 gitlab에서 관리자가 계정을 생성하면 계정 email 로 비밀번호를 발송하는데 요것 때문에 메일서버도 필요하다.

메일서버 설치방법은 요기 참고 : http://webdir.tistory.com/227


※ 설치하고 이것저것 만져보니 쪼금 귀찮아 지긴 하지만, 굳이 메일서버는 안깔아도 되긴된다.


※ 사용자 계정 생성후 다시 편집 화면으로 들어가면 관리자가 임의로 비밀번호를 설정할 수 있고 

 추가된 사용자가 로그인 했을때 비밀번호를 변경하게 시킨다.





요렇게 해주면 모든 설정이 끝난다.


별탈없이 무난하게 설치가 다 끝났다면


http://stove99.tistory.com/git 으로 접속해 보면 뽓 하고 접속이 된다.


ID : root

password : 5iveL!fe






접속해서 이것저것 해보자.


GitLab 사용법은 다음 기회에~~

Mysql ssl 설정 & JDBC 로 SSL 통신




그냥 쌩으로 쿼리 날리고 데이터 받으면 되지 왜 귀찮게시리 SSL 로 통신을 해야 되느냐..?


바로 요 이유 때문이다.


TCP 패킷 캡쳐프로그램으로 보면 select * from user where user='root' 라는 쿼리문장이 고대로 노출이 된다. 

요렇게 되면 로그인할때 비밀번호가 들어간 쿼리도 노출이 된다는 뜻이다.


윈도우용 TCP 패킷 캡쳐 프로그램 : SmartSniff

32bit용 다운로드


64bit용 다운로드





자~~ 요것을 해결해 보자!


먼저 mysql 서버쪽에서 ssl 접속을 허용하도록 설정을 해주야 된다.


그러기 위해선 인증서를 맹글어야 된다. 인증서에 대해선 자세히 나도 잘 모르기 때문에 대충~~ 개인키랑 공개키를 맨들어야 한다쯤으로 이해하고 넘어갔다.



아무튼 인증서를 맹글기 위해서는 openssl 이라는 프로그램을 설치해야 한다.


다 설치가 됬으면 커맨드 창을 열어 명령어를 입력해 인증서를 맹글면 된다.


개인키 맹글기

openssl genrsa -out key.pem 2048


공개키 맹글기

openssl req -new -x509 -key key.pem -out cert.pem -days 0


요렇게 하면 개인키 파일(key.pem)이랑 공개키 파일(cert.pem) 두개가 생성된다.


요 파일을 리눅스 서버일 경우 my.cnf 파일을, 윈도우서버에 깔린 mysql 일 경우 my.ini 파일을 편집해 설정을 추가해 주면 된다.


※ 우분투일 경우 일반적인 경로는 /etc/mysql/my.cnf

※ 윈도우일 경우 일반적인 경로는 C:\Program Files\MySQL\MySQL Server\my.ini


설정파일을 보면 [mysqld] 요런 섹션이 있을껀데 요 섹션 안에다 위에서 만든 인증서 파일을에 대해 아래와 같이 설정을 추가해 준다.


※ 위에서 생성한 key.pem 파일과 cert.pem 파일은 C 드라이브 cert 폴더에 있다고 가정.

ssl-ca=C:\\cert\\cert.pem
ssl-cert=C:\\cert\\cert.pem
ssl-key=C:\\cert\\key.pem


요런 설정을 해주고 mysql 서버를 리스탓트 하면 mysql을 SSL 로 접속할 수 있게 된다.


확실하게 적용이 쪽바로 됐나 확인 할려면 아무툴이나 mysql 로 접속해서 요런 쿼리를 날려보면 간단하게 확인할 수 있다.

show variables like '%ssl%';



죠 두항목이 YES 이면 설정이 쪽바로 적용된 것이다.





※ 인증서를 가지고 SSL 로 접속할려면 요런 옵션으로 접속하면 된다.

mysql -u root -p --ssl --ssl-ca=c:\cert\cert.pem



※ Toad for MySQL 에서 SSL 로 접속하기



커넥션 타입중에 보면 SSL 이라고 있는데 고걸 선택하고 계정정보를 입력하면된다, 인증서 파일을 선택하라고 하는데 굳이 선택하지 않아도 접속이 잘된다.





자~~~ 이제 마지막으로 JDBC로 SSL 접속을 하는 방법을 알아보자.


검색을 해 보니 이것저것 나오던데 방법이 쓸데없이 쫌 복잡해서~~~ 


간단 of 간단한 방법을 재수좋게 검색을 해서 찾아냈다. 아래와 같은 코드를 쓰면 된다.




키뽀인트는 JDBC URL 에 verifyServerCertificate=false 를 추가해 주는것이다. 


저 옵션을 추가해주지 않으면 keytool 로 자바용 keystore 도 맹글어야 하고, 맹글어진 keystore를 시스템 프로퍼티에 추가해 줘야 되는 귀찮은걸 해야 한다.


저 옵션은 말그대로 서버 인증서를 verify 하지 않겠다는 옵션이다.


그리고 당연히 useSSL=true 옵션을 줘야 SSL 로 접속을 한다.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class Test {
	public static void main(String[] args) throws SQLException {
		Connection con = null;
		try {
			String url = "jdbc:mysql://127.0.0.1:3306/mysql?useSSL=true&verifyServerCertificate=false";

			Class.forName("com.mysql.jdbc.Driver");
			con = DriverManager.getConnection(url, "user_name", "user_password");

			Statement st = con.createStatement();
			ResultSet rs = st.executeQuery("select * from user where user='root'");

			while (rs.next()) {
				System.out.println(String.format("%-20s %-20s", rs.getString(1), rs.getString(2)));
			}
		} catch (Exception ex) {
			ex.printStackTrace();
		} finally {
			if (con != null)
				con.close();
		}
	}
}


요걸 실행시키고 TCP 패킷 캡쳐 프로그램으로 보면 요렇게 암호화가 잘되 있다~~



결론 : 

MySQL 서버에 SSL 설정만 해주고, 기존 프로젝트 JDBC URL 에 useSSL=true&verifyServerCertificate=false 요것만 추가해 주면 간단하게 SSL 로 암호화 할 수 있다.

MySQL 서버에 접속하던 다른 서비스가 있어도 다른 서비스에는 영향이 없다.


MySQL 테이블명 대소문자 구분안하기

윈도우에서는 MySQL 설치 디렉토리\my.inf 파일을 수정하면 되고

리눅스 같은거에서는 /etc/my.cnf 파일을 수정하면 된다.


아무튼 my.xxx 파일을 열어보면

[mysqld]  요부분이 있을건데

[mysqld] 아래쪽에
lower_case_table_names=1
를 추가하고 MySQL 을 리스타트 하면

SELECT * FROM TEST; 
SELECT * FROM test;

둘다 에러없이 실행된다. 

※ 데이터베이스나 테이블을 생성할때 디비명과 테이블명은 "소문자" 로 생성해야 한다. 
※  lower_case_table_names=1 요 옵션의 의미가 명령어가 대문자로 들어오던 소문자로 들어오던 명령어를 소문자로 바꿔서 실행하게 하는 옵션인듯하다.

MySQL : XAER_RMFAIL: The command cannot be executed when global transaction is in the ACTIVE state 에러가 날때

MySQL XA JDBC 드라이버를 사용할때

하나의 트랜젝션 안에서 실행되는 SQL 들 중에  ALTER TABLE, CREATE INDEX, DROP INDEX, DROP TABLE, RENAME TABLE 요런것들이 있을때 나는 에러이다.

뭐 이런 에러를 볼 경우가 거의 없겠지만

나 같은 경우는 MySQL 과 Oracle 을 같이 묶어서 트랜젝션 처리를 해야해서 XA 드라이버를 사용해야 했고

MySQL 쪽은 Stored Procedure 에서 디비쪽 관련작업을 다 했기 때문에 몇몇 SP 안에서  임시테이블을 사용해야 해서

CREATE TEMPORARY TABLE TMP1

DROP TABLE IF EXISTS TMP1

요런게 있었다.

CREATE TABLE 은 TEMPORARY 키워드를 붙여줘서 상관이 없었는데 DROP TABLE 은 별 생각을 안하고 TEMPORARY 키워드가 없었기 때문에 

XAER_RMFAIL: The command cannot be executed when global transaction is in the ACTIVE state 요런 Exception 이 발생했다.



해결하기 위해서는  

DROP TABLE IF EXISTS TMP1  에  DROP TEMPORARY TABLE IF EXISTS TMP1 요렇게 TEMPORARY 키워드를 추가하면 된다.





참고링크:

http://dev.mysql.com/doc/refman/5.0/en/xa-states.html

http://dev.mysql.com/doc/refman/5.0/en/implicit-commit.html 
prev 1 next