'Game > Overwatch' 카테고리의 다른 글
[Overwatch] 오버워치리그 결승 - 한국 vs 러시아 (0) | 2016.11.07 |
---|---|
[Overwatch] 유일하게 하는 온라인 ㄱㅔ임. (0) | 2016.11.07 |
[Overwatch] 오버워치리그 결승 - 한국 vs 러시아 (0) | 2016.11.07 |
---|---|
[Overwatch] 유일하게 하는 온라인 ㄱㅔ임. (0) | 2016.11.07 |
[Overwatch] 오버워치리그 8강 - 한국 vs 미국 (0) | 2016.11.07 |
---|---|
[Overwatch] 유일하게 하는 온라인 ㄱㅔ임. (0) | 2016.11.07 |
온라인 게임은 피파온라인3를 하다가...(2~3년..?)
오버워치를 시작했다..
시작한지는 2~3달 정도 되었는데...하루에 한시간씩은 거의 하는 듯 하다.
즐겨하는 유저로써(트롤이라고 많이하던데...이런 용어도 이제는 낯설다.)
궂이 카테고리를 만들 필요도 없지만...
가끔 동영상이나 퍼올리려고 한다..ㅎㅎ
언제든지 친구추가는 환영!!
베틀넷 ID : EinsBong#3852
[Overwatch] 오버워치리그 8강 - 한국 vs 미국 (0) | 2016.11.07 |
---|---|
[Overwatch] 오버워치리그 결승 - 한국 vs 러시아 (0) | 2016.11.07 |
MySQL 3.2 에서 MySQL5.6으로 올라오면서 바뀐것 중 하나가 password 함수이다.
즉, password 함수의 구현 알고리즘이 달라져서 암호화 된 내용이 달라졌다.
그러다 보니 해당 password 함수를 사용하는 것들이 바뀌어서 접속이 안되는 현상이 발생한다.
그래서 기존 password 함수를 사용하고자 한다면 old_password 를 설정하면 된다.
vi /etc/my.cnf
아래 내용을 추가해 주자.
[Client]
secure_auth=0
[mysqld]
old_passwords=1
secure_auth=0
이후, DB를 재기동한 후 아래 명령어를 한번 더 확인해 보자
mysql> set old_passwords = 1;
Query OK, 0 rows affected (0.00 sec)
mysql> update user set plugin = 'mysql_old_password';
결국 이것 저것 해보다 해답을 찾았다.
아래와 같이 진행하면 정상적으로 생성 및 접속이 가능한 것을 확인할 수 있다.
1. create user 'user'@'%';
2. GRANT ALL PRIVILEGES ON *.* TO 'user'@'%';
3. select password('비번') 결과 복사
4. update mysql.user set password= '복사한 비번 암호화' where user='user' and host = '%';
5. update mysql.user set plugin = 'mysql_old_password' where user='user' and host = '%';
6. flush privileges;
7. 재접속 확인
mysql> grant all privileges on *.* to '아이디'@'localhost';
Query OK, 0 rows affected (0.00 sec)
mysql> select password('비밀번호');
+--------------------------+
| password('비밀번호') |
+--------------------------+
| 019026871ad12fba |
+--------------------------+
1 row in set (0.00 sec)
mysql> update mysql.user set password = '019026871ad12fba' where user='아이디';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
*************************** 8. row ***************************
Host: localhost
User: 아이디
Password: 019026871ad12fba
Select_priv: Y
Insert_priv: Y
Update_priv: Y
Delete_priv: Y
Create_priv: Y
Drop_priv: Y
Reload_priv: Y
Shutdown_priv: Y
Process_priv: Y
File_priv: Y
Grant_priv: N
References_priv: Y
Index_priv: Y
Alter_priv: Y
Show_db_priv: Y
Super_priv: Y
Create_tmp_table_priv: Y
Lock_tables_priv: Y
Execute_priv: Y
Repl_slave_priv: Y
Repl_client_priv: Y
Create_view_priv: Y
Show_view_priv: Y
Create_routine_priv: Y
Alter_routine_priv: Y
Create_user_priv: Y
Event_priv: Y
Trigger_priv: Y
Create_tablespace_priv: Y
ssl_type:
ssl_cipher:
x509_issuer:
x509_subject:
max_questions: 0
max_updates: 0
max_connections: 0
max_user_connections: 0
plugin: mysql_native_password <---해당 plugin도 update로 변경하자.
authentication_string:
password_expired: N
8 rows in set (0.00 sec)
이후 접속하면 정상적으로 접속 되는 것을 확인할 수 있다.
더 좋은 해결방안이 있으면 알려주세요.ㅠ
[MySQL] auto_increment duplicate entry for key 1 (0) | 2016.11.14 |
---|---|
[MySQL] MS SQL to MySQL Migration (3) | 2016.11.09 |
[펌][MySQL] Stored Procedure 와 Compile (0) | 2016.11.03 |
[펌]인덱스, 아는 만큼 보인다!......DBMS 개발자가 전하는 인덱스 활용 노하우 (0) | 2016.11.02 |
[펌][MySQL] 왜, MySQL 스토어드 프로시져는 MSSQL이나 Oracle처럼 사용하면 안될까 ? [출처] (MySQL Power Group) |작성자 토토 (0) | 2016.10.28 |
출처 : http://jhw0604.tistory.com/125
아래 내용 중 http://www.joinfu.com/2010/05/mysql-stored-procedures-aint-all-that/ 사이트의 내용은
출처에서 알려주는 내용처럼 sp가 컴파일되고 connection을 끊고 다시 sp 를 사용하려면 기존 컴파일을 재사용 되지 않는 다는 것이다.
그래서 응용 프로그램에서는 connection pool 연결하여 connection을 끊지 않고 캐쉬의 내용을 재사용하는 방법이 있다.
(JDBC connection pooling / 동일 connection에서 sp 를 지속적으로 실행 / 제한된 수의 sp로 설정하여 메모리 사용의 이슈가 없도록 설정)
- 발번역이라도 해서 올리려고 시도하다가 오역을 알려줄수 있다는 생각과 자괴감에 번역하다 포기했습니다....겨우 오픽im1주제에....ㅋㅋㅋ
이 문제로 많은 고민을 했었는데
MySQL은 SQL Server나 Oracle과 다르게 SP가 처음 한번만 컴파일 되고 재사용 되는것이 아니다.
http://www.joinfu.com/2010/05/mysql-stored-procedures-aint-all-that/
위 링크를 참고하면 커넥션 별로 컴파일이 관리되는데 말인데
즉 어플단에서 쿼리로 실행하나 SP로 실행시키나 컴파일하고 실행하는 과정에서 성능상 이득을 취하긴 어렵다는것!
물론 SP를 사용함으로서 프로그램과 데이터 조작과의 관계를 분리 할 수 있고(추후 SQL 튜닝 및 스키마 수정에 유리)
SP실행 권한만 줌으로서 인젝션과 같은 공격에서 상대적으로 안전하며
짧은 요청 문장으로 인한 트래픽 감소
트리거를 사용하지 않고도 데이터의 참조 무결성 유지
http://ko.wikipedia.org/wiki/%EC%A0%80%EC%9E%A5_%ED%94%84%EB%A1%9C%EC%8B%9C%EC%A0%80
등의 장점은 여전히 남아 있다.
그러면 컴파일 된 프로시저를 그냥 아깝게 버리느냐... 하면
mysql-proxy나 sqlrelay 등을 사용해서 Connection Pool을 구축한다면 커넥션을 한번만 맺고 재사용하기에 극복 할 수 있으니
MySQL을 사용하면 SP는 사용하면 안된다 하지 말고 커넥션 풀을 구축해서 사용하면 커넥션 비용도 감소하고 SP 컴파일도 재사용 가능하니 일석이조의 효과가!!
http://sqlrelay.sourceforge.net/
http://dev.mysql.com/downloads/mysql-proxy/
[MySQL] MS SQL to MySQL Migration (3) | 2016.11.09 |
---|---|
[MySQL] old_passwords 관련 에러 (1) | 2016.11.04 |
[펌]인덱스, 아는 만큼 보인다!......DBMS 개발자가 전하는 인덱스 활용 노하우 (0) | 2016.11.02 |
[펌][MySQL] 왜, MySQL 스토어드 프로시져는 MSSQL이나 Oracle처럼 사용하면 안될까 ? [출처] (MySQL Power Group) |작성자 토토 (0) | 2016.10.28 |
[MySQL] isolation level 종류 및 특징 (0) | 2016.10.26 |
[MySQL] old_passwords 관련 에러 (1) | 2016.11.04 |
---|---|
[펌][MySQL] Stored Procedure 와 Compile (0) | 2016.11.03 |
[펌][MySQL] 왜, MySQL 스토어드 프로시져는 MSSQL이나 Oracle처럼 사용하면 안될까 ? [출처] (MySQL Power Group) |작성자 토토 (0) | 2016.10.28 |
[MySQL] isolation level 종류 및 특징 (0) | 2016.10.26 |
[펌][MySQL] 왜 isolation-level Read-committed 에서 Binlog_format Mixed 이어도 모두 row format으로 binary 로그가 남을까? (0) | 2016.10.20 |
요즘 3.2 에서 5.6.32 로 Data Migration 이 가능하도록 개발 중이다.
그 중에 잠시 이슈를 정리하고 간다.
MySQL 5.6.32 를 설치한 곳에서 python 으로
import MySQLdb;
를 하게 되면 아래와 같은 에러가 발생한다.
Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "build/bdist.linux-x86_64/egg/MySQLdb/__init__.py", line 19, in ?
File "build/bdist.linux-x86_64/egg/_mysql.py", line 7, in ?
File "build/bdist.linux-x86_64/egg/_mysql.py", line 6, in __bootstrap__
ImportError: libmysqlclient.so.10: cannot open shared object file: No such file or directory
MySQL 설치된 곳 lib 폴더 내에 해당 libmysqlclient.so.10 파일이 없는 것을 확인 하였다.
검색하다 보니 여기저기 설정하라고 하는데 정작 설치가 되어 있지 않은 것 같아 rpm 으로 설치를 하였다.
아래 내용들은 잘못 되었다...하지만 참고하신 분들이 있을 것 같아서 삭제는 안하고 선을 그었다.
아래는 설정하라는 위치들이다.
/etc/profile
/etc/ld.so.conf
하지만 설치가 우선이라..
아래와 같이 다운 받은 후 설치 해 보자
[root@DBTEST02:/home/backup]# wget ftp://195.220.108.108/linux/Mandriva/official/9.1/i586/Mandrake/RPMS/libmysql10-3.23.55-1mdk.i586.rpm
[root@DBTEST02:/home/backup]# rpm -ivh libmysql10-3.23.55-1mdk.i586.rpm
이러면 설치는 되지만 여전히 import 할 수 없다.
그래서 해당 설치된 위치를 찾아보면 아래와 같다.
[root@DBTEST02:/home/backup]# find / -name libmysqlclient.so.10
/root/src/mysql-3.23.58/libmysql/.libs/libmysqlclient.so.10
/usr/lib/libmysqlclient.so.10
이제 /etc/profile 에 설정을 해 보자.
[root@DBTEST02:/home/backup]# vi /etc/profile
아래 내용을 추가 후 적용해 보자
LD_LIBRARY_PATH=/root/src/mysql-3.23.58/libmysql/.libs/
export LD_LIBRARY_PATH
[root@DBTEST02:/home/backup]# source /etc/profile
이러고 나면 제대로 되는 것을 확인할 수 있다.
하지만.......5.6에 접속이 되지 않는다.
Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "build/bdist.linux-x86_64/egg/MySQLdb/__init__.py", line 74, in Connect
File "build/bdist.linux-x86_64/egg/MySQLdb/connections.py", line 170, in __init__
_mysql_exceptions.OperationalError: (1251, 'Client does not support authentication protocol requested by server; consider upgrading MySQL client')
그렇구나.....다시 검색이 필요하다...
의외로 간단하게 풀었다.
/usr/local/mysql/lib 폴더 내의 libmysqlclient.so.18 을 soft link를 걸어서 생성해 주었다.
[root@DBTEST02:/usr/local/mysql/lib]# ln -s libmysqlclient.so.18.1.0 libmysqlclient.so.10
[root@DBTEST02:/usr/local/mysql/lib]# chown mysql:mysql libmysqlclient.so.10
이후에 session 을 끊은 후 다시 접속하여 확인해 보니 쉽게 통과 했다.
하지만.....다른 에러를 지금 풀고있다.
위의 내용은 쓸데없이 다른 환경설정 건들지 말고 soft link(symbolic link) 로 생성해 주면 된다.
해당 내용은 일단 끝!
추가로 환경설정이 필요해서 추가합니다.
1. cd /etc/ld.so.conf
2. vi로 아무 파일명 생성하여 아래 내용 추가
/usr/local/mysql/lib
ldconfig 를 쳐서 적용
3. vi ~/.bash_profile
LD_LIBRARY_PATH=/usr/local/mysql/lib
export LD_LIBRARY_PATH
이후 source ~/.bash_profile
한 후 혹시나 하는 마음에 해당 세션 종료 후 다시 접속 후 확인
[Python] Tensorflow #1 (1) | 2017.07.06 |
---|---|
[Python Script] Maria DB Table Sync 맞추기 (0) | 2017.02.13 |
[Python] os.system / SCP 전송 (ssh 비밀번호 없이) (0) | 2016.10.25 |
[펌][Python] OS 관련 명령어 (0) | 2016.10.21 |
[펌] [python] pass, continue 차이 (0) | 2016.03.08 |
[펌] http://cafe.naver.com/mysqlpg (MySQL Power Group - 네이버까페)
MySQL의 스토어드 프로그램(이 글에서 스토어드 프로그램은 Stored procedure와 Stored Function에 한함)은 MySQL 5.0버전부터 지원되기 시작했다. MySQL 5.0의 첫번째 릴리즈 버전이 2005년도 10월에 출시되었으니, MySQL에 프로시져가 도입된지 벌써 10년 정도의 시간이 지나가고 있지만 실제로 MySQL에서 프로시져의 인기는 그다지 높지 않다.
요즘은 MSSQL이나 Oracle에 익숙한 사용자(개발자와 DBA 모두)들이 MySQL을 배우거나 사용하고자 하는 경우가 많이 늘어나고 있는데, 많은 사용자들이 MySQL 만의 특징에 익숙치 않아서 혼란스러워하는 경우를 많이 보았다.
특히나 MySQL은 주로 Web 기반의 서비스에서 사용되다 보니, MSSQL이나 Oracle과 같은 RDBMS에서 효율적으로 제공하는 기능들이 MySQL에서는 그렇지 못한 것들이 자주 있다. 물론 때로는 그 반대인 경우도 흔히 볼 수 있다.
그중에서 가장 많은 이슈가 되고 있는 스토어드 프로그램의 특징을 간단히 살펴보고, 왜 MySQL에서는 Oracle이나 MSSQL에서와 같이 스토어드 프로그램을 활용할 수 없는지를 소개해보고자 한다.
다른 상용의 RDBMS에서와 같이 MySQL 서버에서도 스토어드 프로그램은 컴파일 과정을 거치게 된다. 물론 C/C++과 같이 물리적인 CPU가 직접 해석할 수 있는 이진 코드가 만들어지는 것은 아니지만, Java와 같이 어떤 형태의 목적 코드(Java의 바이트 코드와 같은)가 만들어지고
이 목적 코드는 메모리상에 저장되어서 나중에 재실행 요청시에는 준비된 바이트 코드가 실행된다. 즉 스토어드 프로그램의 소스 코드가 매번 실행될 때마다 파싱되고 분석되어서 실행되는 것이 아니란 것을 의미한다.
간단히 아래와 같은 프로시져를 생각해보자.
CREATE PROCEDURE sp_test(p CHAR(16))
BEGIN
DECLARE x INT;
SET x = 3;
WHILE x > 0 DO
SET x = x-1;
INSERT INTO tab_test VALUES (x, p);
END WHILE;
END
위의 프로시져가 컴파일되면, 아래와 같은 목적 코드가 만들어지게 된다.
목적 코드에서는 단순히 스토어드 프로그램의 코드에서 SET 이나 WHILE과 같은 문장들을 sp_instr_set이나 sp_instr_jump 등과 같은 인스트럭션으로 변환된 형태로 관리하게 된다.
여기에서 한 가지 기억해야 할 것은 컴파일된 스토어드 프로그램의 목적 코드에서 SQL 문장은 그대로 문자열로 남아있게 된다는 것이다. 즉 MySQL의 스토어드 프로그램은 컴파일이 되어도 내부에 사용된 SQL 문장들을 바로 실행할 수 있는 실행 계획이나 Parsed-Tree 형태로 관리하는 것이 아니란 것을 의미한다.
---------+-----------------------------------------------------
Position | Instruction
---------+-----------------------------------------------------
0 | sp_instr_set(1, '3')
1 | sp_instr_jump_if_not(5, 'x>0')
2 | sp_instr_set(1, 'x-1')
3 | sp_instr_stmt('INSERT INTO tab_test VALUES (x, p)')
4 | sp_instr_jump(1)
5 | <end>
---------+-----------------------------------------------------
Oracle이나 MSSQL의 스토어드 프로그램은 전역의 스토어드 프로그램 캐시 공간(Memory)에 관리된다. 물론 MySQL 서버의 스토어드 프로그램도 컴파일되면 스토어드 프로그램 캐시(소스 코드에서는 이를 sp_cache라고 함)에 관리한다.
하지만 MySQL의 스토어드 프로그램 캐시는 전역이 아니라 Thread 단위로 관리된다. 여기서 Thread라 함은 사실은 Connection 기반으로 관리됨을 의미한다. 만약 Thread pool을 사용한다 하더라도, 실제 Linux의 Thread 단위가 아니라 Connection 단위의 메모리 공간(THD)에 관리되는 것이다.
큰 차이가 아닌 것 같지만, 사실 스토어드 프로그램 캐시가 전역이나 세션(로컬) 단위냐에 따라서 장단점은 크게 달라진다.
MySQL의 스토어드 프로그램 캐시 공간은 Connection 단위로 관리된다는 것은 컨넥션이 새로 생성되면 필요한 모든 프로시져의 컴파일이 필요하다는 것을 의미한다.
만약 Connection pool이나 PHP의 Persistent-connection을 사용하지 못하고 매번 Connection을 생성해야 하는 경우라면, 매번 스토어드 프로그램이 실행될 때마다 스토어드 프로그램을 (mysql.proc 테이블에서) 읽어서 컴파일을 해야 하므로 최악의 성능을 내게 될 것이다.
그렇다고 Connection pool이나 Persistent-Connection 환경이라고 안전한 것은 아니다. 많은 스토어드 프로그램이 사용되는 서비스에서 MySQL 서버에 연결된 컨넥션이 10000개라고 가정하면 엄청난 메모리 공간이 필요하게 될 것이다.
하지만 성능 향상을 고려한다면, 스토어드 프로그램 캐시 메모리 공간을 적게 설정할 수도 없는 진퇴양난의 상황에 빠지게 될 수도 있다.
MySQL 서버의 스토어드 프로그램 캐시 공간은 컨넥션간 서로 공유되는 전역 공간이 아니라, 컨넥션 단위로 관리된다는 것을 앞에서 살펴보았다.
사실 스토어드 프로그램 캐시가 컨넥션 단위로 관리되기 때문에 발생하는 문제점이 또 있는데, ALTER나 CRETE 등과 같은 DDL을 이용해서 스토어드 프로그램의 코드를 변경하는 경우이다.
만약 컨넥션이 10000개가 만들어져서 각각의 컨넥션에서 sp_test라는 프로시져를 사용하고 있다고 가정해보자. 이때 DBA가 ALTER PROCEDURE나 DROP PROCEDURE + CREATE PROCEDURE를 실행했다고 가정해보자.
그럼 어떤 현상이 발생하게 될까 ?
프로시져를 변경하는 컨넥션에서는 단순히 해당 프로시져의 정보를 mysql DB에 있는 proc 테이블에 변경 저장하고, 해당 프로시져의 버전을 1 증가시키고 완료된다. 이때 해당 프로시져의 버전은 글로벌하게 전역 메모리 공간에 관리된다.
그리고 모든 서비스 컨넥션에서는 프로시져를 실행하기 전에 항상 로컬 스토어드 프로그램 캐시에 괸리되는 프로시져의 버전과 전역 공간의 프로시져 버전을 확인해서, 로컬 스토어드 프로그램 캐시의 버전이 낮으면 로컬 스토어드 프로그램 캐시에 저장되어 있던 컴파일된 목적 코드를 버리고 다시 컴파일을 수행한다.
이렇게 컴파일이 완료되면, 비로소 해당 프로시져를 실행할 수 있게 되는 것이다.
그나마 다행인 것은, 변경된 프로시져가 자주 실행되지 않는다면 모든 컨넥션이 한번에 동일 스토어드 프로그램을 컴파일하기 위해서 상당한 시간을 소모하지 않을 것이다. 하지만 스토어드 프로그램이 아주 빈번하게 모든 컨넥션에서 활용된다면 어떤 상황이 발생하게 될까 ?
이런 경우라면 일부러 사용량이 별로 없는 새벽 시간에 스토어드 프로그램을 배포해야 할 지도 모르겠다.
(참고로, Oracle의 MySQL 개발팀에서는 Production MySQL 서버에서 스토어드 프로그램을 갱신하는 것은 상당히 드문 케이스이며, 별로 심각하게 고려되지 않는 상황이라고 소개하고 있다. ㅠㅠ)있다
MySQL 서버의 스토어드 프로그램은 컨넥션 단위로 로컬 캐시 영역에 관리되기 때문에, 컨넥션이 많고 사용되는 스토어드 프로그램이 많다면 많은 메모리 공간이 필요할 것이다. 때로는 메모리 부족 현상으로 운영 체제가 MySQL 서버를 강제 종료시킬 수도 있다.
여기에서 스토어드 프로그램의 개수가 많고 적음은 상대적이며, Production MySQL 서버에 장착된 메모리 크기와 여러가지 상황에 따라서 의존적이므로 각 DBA가 적절하게 판단해야 할 것으로 보인다.
MySQL 서버에서는 이런 메모리 과다 사용을 막기 위해서 MySQL 5.5부터 stored_program_cache라는 시스템 변수를 제공하고 있다. 이 변수는 기본 값이 256이며, 설정하는 값의 의미는 스토어드 프로그램 캐시에 저장할 스토어드 프로그램의 개수이다.
스토어드 프로그램 하나 하나의 크기에 의해서도 메모리 사용량이 많이 좌우될 것으로 보이므로, 사실 256이라는 수치가 적절한지 큰 값인지는 판단하기 쉽지 않아 보인다.
만약 스토어드 프로그램 캐시에 저장된 스토어드 프로그램의 개수가 256을 넘게 되면, MySQL 서버는 현재 컨넥션의 스토어드 프로그램 캐시 내용을 모두 무효화시키고 다시 스토어드 프로그램을 하나씩 컴파일해서 저장하게 된다.
물론 스토어드 프로그램이 256개 이상이고 순서대로 하나씩 사용된다면, 위의 무효화 -> 컴파일 과정을 계속 반복하게 될 것이다.
MySQL 스토어드 프로그램의 내부적인 처리 방식을 간단히 살펴보았는데, MySQL의 스토어드 프로그램을 Oracle이나 MSSQL의 그것과 동일하게 생각해서는 안되는 이유를 간략히 정리해보면...
1) 스토어드 프로그램 자체는 컴파일되어서 목적 코드로 관리되지만, 내부의 SQL문장을 파스된 형태(실행계획이나 Parsed-Tree 형태)로 관리하지 않는다.
2) 컴파일된 스토어드 프로그램 목적 코드는 각 컨넥션 단위로 관리되기 때문에 Oracle이나 MSSQL보다 많은 메모리 공간이 필요하다.
3) 스토어드 프로그램이 변경될 때마다, 모든 컨넥션에서 기존 목적 코드의 무효화 및 신규 프로시져의 컴파일 과정일 필요하다.
또한 MySQL은 Web 기반의 단순 쿼리를 고속으로 처리해주는 용도로 많이 활용된다. 그래서 Facebook이나 Twitter 등의 SNS 회사들은 WebScaleSQL이라는 목표로 MySQL 코드 패치를 수행하고 있기도 하다.
이런 방향성으로 본다면, 스토어드 프로그램과 같은 복잡한 절차적 코드(Compound-statement block)를 확장이 어려운 MySQL 서버에 둔다는 것은 적절치 않을 수 있다.
Oracle이나 MSSQL에서는 모든 처리를 DBMS 서버로 집중화하고 서버를 통합(Consolidation) 것이 목표였다면, MySQL의 목표는 그 반대로 볼 수 있다. MySQL은 라이센스 비용이 없으니깐 말이다.
물론 라이센스 비용 이야기는 어떤 형태의 기술 지원을 받는냐에 따라 이야기가 달라지겠지만, 그래도 Oracle이나 MSSQL의 라이센스 비용에 비할바는 아닐 것이다.
[펌][MySQL] Stored Procedure 와 Compile (0) | 2016.11.03 |
---|---|
[펌]인덱스, 아는 만큼 보인다!......DBMS 개발자가 전하는 인덱스 활용 노하우 (0) | 2016.11.02 |
[MySQL] isolation level 종류 및 특징 (0) | 2016.10.26 |
[펌][MySQL] 왜 isolation-level Read-committed 에서 Binlog_format Mixed 이어도 모두 row format으로 binary 로그가 남을까? (0) | 2016.10.20 |
[MySQL] UTF-8 / utf8mb4 (0) | 2016.10.20 |
꾸준히 공부한 것에 다시 정리하면서 보니 이해 했던 부분은 더 쉽게 머리에 남고..
헷갈렸고 몰랐던 부분에 대해서는 정리가 되는 것 같다.
오늘은 Transaction 에 대한 isolation 정리다.
※ isolation level (Transaction 격리 수준)
- 동시에 여러 트랜잭션이 처리될 때, 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있도록 허용할지 말지를 결정
- 격리 수준 : " Read Uncommitted", "Read Committed", "Repeatable Read", "Serializable"
- 격리 수준이 높아질수록 동시성도 떨어지는 것이 일반적이라고 볼 수 있다.
3. Repeatable Read
※ MVCC(Multi Version Concurrency Control)
: 잠금을 사용하지 않는 일관된 읽기를 제공하는 것이 목적
이해를 하기 위해 다시 정리
- Read Uncommitted : 변경되었거나 안된 데이터의 값을 읽음
- Read Committed(그 이상의 경리 수준 - Repeatable_Read, Serializable) : 변경 전 Undo에 있는 값을 읽음
-> 이러한 과정을 MVCC라고 표현
4. Serializable
5. Repeatable Read 격리 수준과 Read Committed 격리 수준의 성능 비교
사실 이해하기 위해서는 Transaction 이 일어나는 현상을 이미지로 설명한 것을 읽으면 빠를 듯 싶다.
또한 MySQL(Repeatable Read) 과 Oracle(Read Committed) 은 격리수준이 다르다.
[펌]인덱스, 아는 만큼 보인다!......DBMS 개발자가 전하는 인덱스 활용 노하우 (0) | 2016.11.02 |
---|---|
[펌][MySQL] 왜, MySQL 스토어드 프로시져는 MSSQL이나 Oracle처럼 사용하면 안될까 ? [출처] (MySQL Power Group) |작성자 토토 (0) | 2016.10.28 |
[펌][MySQL] 왜 isolation-level Read-committed 에서 Binlog_format Mixed 이어도 모두 row format으로 binary 로그가 남을까? (0) | 2016.10.20 |
[MySQL] UTF-8 / utf8mb4 (0) | 2016.10.20 |
[MySQL] mysqllbinlog event_type: 19 (0) | 2016.10.20 |
현재 MySQL 3.28 로 구성된 Slave를 MySQL 5.6.31 로 업그레이드 작업을 진행 중이다.
Master의 경우 작업 당일날 진행할 예정이고,
Slave의 경우 백업 데이터가 일 단위로 구성되고 있기에 이 부분에 대해 먼저 다른 장비로 Migration 을 진행 하기로 했다.
매일 Dump를 이용해서 작업 하기에는 지루한 작업이 될 것이다.
그래서 매일 백업 데이터를 dump 받아 scp 로 전송 후 다른 장비에서 해당 dump를 이용한 load 및 데이터 건수 비교하는 스크립트를 개발 중이다.
그 중 scp 로 전송하는 방법이 잠시 막혀 공유하고자 한다.
scp 를 이용하는 방법으로 검색하면 twisted ? paramiko_scp ? pexpect ? 등을 설치해서 간편하게 사용하는 방법이 있지만..
가급적이면 설치 등은 피하는 방법을 사용하다 보니
어쩔 수 없이 os.system 이라는 명령문을 사용할 수 밖에 없었다.
os.system은 os에서 사용하는 shell 명령문을 사용 가능하도록 하는 문장인데...
scp 를 하게 되면 먹통이 되는 현상을 확인할 수 있었다.
또한 간단하게 테스트하기 위해서 python에서 직접 os.system 사용하여 scp 를 날리면 비밀번호를 묻는 것을 확인할 수 있었다.
(비밀 번호 묻는게 당연한 이야기 이겠지만....)
여러가지 확인중 ssh 를 이용하여 비밀번호 묻지 않고 바로 전송 하는 방법으로 진행 했더니 정상적으로 전송이 되는 것을 확인할 수 있었다.
아래는 간단하게 ssh 암호 묻지 않는 방법에 대해서 공유해 본다.
(물론 암호 관련하여서는 가급적이면 하지 않는 방법이 최선이며, 꼭 해야 된다면 내부망에서만 가능하도록 하자)
- SSH 암호 없이 접속하는 방법
접속시도하는 (source OS) 에서
1. ssh key 생성
$ ssh-keygen -t rsa
- /root/.ssh/ 아래에 암호 관련된 파일이 생성
2. ssh 복사
- /root/.ssh/id_rsa.pub 파일을 cat 으로 열어 내용을 복사
3. Target OS에서 authorized_keys 생성
- Target (접속하는 서버) 의 /root/.ssh/authorized_keys 파일을 만들어 내용 복사 진행
4. 테스트 진행
- source OS에서 target OS 으로 접속 진행 테스트
- port는 1004 라고 가정
$ ssh -p 1004 192.168.0.2
암호없이 접속 되면 성공
어쩌면 이것도 ETL 의 개념???과 비슷하지 않을까 싶다. ㅎㅎㅎㅎㅎㅎㅎㅎ
ETL 이란 ? [출처] 위키백과 https://ko.wikipedia.org/wiki/%EC%B6%94%EC%B6%9C,_%EB%B3%80%ED%99%98,_%EC%A0%81%EC%9E%AC
추출, 변환, 적재(Extract, transform, load, ETL)는 컴퓨팅에서 데이터베이스 이용의 한 과정으로 특히 데이터 웨어하우스에서 다음을 아우른다:
동일 기종 또는 타기종의 데이터 소스로부터 데이터를 추출한다.
조회 또는 분석을 목적으로 적절한 포맷이나 구조로 데이터를 저장하기 위해 데이터를 변환한다.
최종 대상(데이터베이스, 특히 운영 데이터 스토어, 데이터 마트, 데이터 웨어하우스)으로 변환 데이터를 적재한다.
[Python Script] Maria DB Table Sync 맞추기 (0) | 2017.02.13 |
---|---|
[Python] libmysqlclient.so.10 Error (2) | 2016.11.02 |
[펌][Python] OS 관련 명령어 (0) | 2016.10.21 |
[펌] [python] pass, continue 차이 (0) | 2016.03.08 |
[펌] [python] FTPlib (1) | 2016.03.08 |