mysql int bigint

Database/DB 2016.06.20 11:51

mysql을 사용하면서  몰랐던 정보들을 알아서 적어본다. 


int / bigint 에 관한 내용인데 


먼저 int / bigint 의 최대값은 unsigned 일 경우 각각 4억과 4천경이다(저만큼 넣을 데이터가 있는건가..)......


int는 4바이트(자릿수 10자리)


bigint는 8바이트로 (자릿수 20자리) 로 생각면 된다. 


자세한 사항은 공식 홈피 확인


https://dev.mysql.com/doc/refman/5.5/en/integer-types.html




두번째로 대부분 많은 분들이 테이블 선언시 int(4) 하면 4자리까지만 들어간다고 생각하실수도 있는데 (실은 내가 그랬다.)


만일 3자리 숫자 999 를 넣었다면 출력될때 0999 로 해당 4자리이하일때 앞에 0을 붙여서 내보낸다. (zerofill 옵션)


물론 저장할때엔 그냥 999로 저장함. 


그러니 테이블 생성할때 int(숫자)라면 단순히 zerofill 옵션이니 필요없다면 굳이 사용안해도 된다. (자릿수를 위한거라면 TINYINT / SMALLINT / MEDIUMINT 을 써야 옳다.)




저작자 표시
신고

WRITTEN BY
No.190
세계정복의 시작점

받은 트랙백이 없고 , 댓글이 없습니다.
secret


재미있는것을 발견( 지금까지 몰랐던것을 발견)!!



테이블간의 관계인 fk( Foreign Key Constraint) 가 설정되어 있을때 

fk 생성시 해당 칼럼을 not null 속성을 넣지 않았다. (이건 가능함)

헌데 not null  속성을 넣을려면


먼저 해당 fk 를 지운후 alter 로 notnull 속성을 넣어준후 다시 fk 속성을 넣어줘야 한다. 


여기까진 문제가 없다. 

이번엔 unsigned 속성을 넣어보려 한다. 

헌데  fk의 기본이 되는 pk 속성중에 unsigned 속성이 없다면 어떻게 되느냐?!


아까와 같이 

"먼저 해당 fk 를 지운후 alter 로 unsigned 속성을 넣어준후 다시 fk 속성을 넣어줘야 한다. "

에서 unsigned 속성을 넣은후 다시 fk 속성을 넣을 때 에러가 발생한다!!!

왜냐하면 fk의 pk의 속성엔 unsigned 속성이 없으니까!!

문제는 이때 fk는 지워졌지만 unsigned 속성은 정상적으로 들어가 있다. (fk 주기 전에 속성을 변경했으므로)


그래서 "어라?! 에러가 났는데 잘 되어 있네?!" 라고 생각하도 진행하다가 fk가 없어진거 발견.

헌데 fk를 넣을려고 하면 그냥 해당 FK넣을수 있는 칸이 생성되질 않는다. (mysql workbench 시)

이게 뭐야.. 하면서 몇시간을 허비.. 


이래서 IDE자동화가 무서운 겁니다. 

오늘의 교훈!! IDE를 너무 믿진 마세요!!



- 아마 콘솔로 작업했으면 에러 메시지 보고 바로 해결했을 경우이다. 




저작자 표시
신고

WRITTEN BY
No.190
세계정복의 시작점

받은 트랙백이 없고 , 댓글이 없습니다.
secret



spark 내 maven 으로 하둡관련 설치 시  아래와 같이 에러가 난다면 


 [WARNING] Rule 0: org.apache.maven.plugins.enforcer.RequireMavenVersion failed with message:

Detected Maven Version: 3.0.5 is not in the allowed range 3.3.3.

[INFO] ------------------------------------------------------------------------

[INFO] Reactor Summary:

[INFO] 

[INFO] Spark Project Parent POM .......................... FAILURE [2:25.599s]

[INFO] Spark Project Launcher ............................ SKIPPED

[INFO] Spark Project Networking .......................... SKIPPED

[INFO] Spark Project Shuffle Streaming Service ........... SKIPPED

[INFO] Spark Project Unsafe .............................. SKIPPED

[INFO] Spark Project Core ................................ SKIPPED

[INFO] Spark Project Bagel ............................... SKIPPED

[INFO] Spark Project GraphX .............................. SKIPPED

[INFO] Spark Project Streaming ........................... SKIPPED

[INFO] Spark Project Catalyst ............................ SKIPPED

[INFO] Spark Project SQL ................................. SKIPPED

[INFO] Spark Project ML Library .......................... SKIPPED

[INFO] Spark Project Tools ............................... SKIPPED

[INFO] Spark Project Hive ................................ SKIPPED

[INFO] Spark Project REPL ................................ SKIPPED

[INFO] Spark Project YARN ................................ SKIPPED

[INFO] Spark Project Assembly ............................ SKIPPED

[INFO] Spark Project External Twitter .................... SKIPPED

[INFO] Spark Project External Flume Sink ................. SKIPPED

[INFO] Spark Project External Flume ...................... SKIPPED

[INFO] Spark Project External Flume Assembly ............. SKIPPED

[INFO] Spark Project External MQTT ....................... SKIPPED

[INFO] Spark Project External MQTT Assembly .............. SKIPPED

[INFO] Spark Project External ZeroMQ ..................... SKIPPED

[INFO] Spark Project External Kafka ...................... SKIPPED

[INFO] Spark Project Examples ............................ SKIPPED

[INFO] Spark Project External Kafka Assembly ............. SKIPPED

[INFO] Spark Project YARN Shuffle Service ................ SKIPPED

[INFO] ------------------------------------------------------------------------

[INFO] BUILD FAILURE

[INFO] ------------------------------------------------------------------------

[INFO] Total time: 2:29.749s

[INFO] Finished at: Tue May 17 12:55:42 KST 2016

[INFO] Final Memory: 21M/52M

[INFO] ------------------------------------------------------------------------

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-enforcer-plugin:1.4:enforce (enforce-versions) on project spark-parent_2.10: Some Enforcer rules have failed. Look above for specific messages explaining why the rule failed. -> [Help 1]



spark 으로 다운받은 maven 이 버전이 낮아서 생기는 에러라고 합니다. 


헌데 spark 최신버전에서도 이게 고쳐지지가 않다는....(어쩌라는거지??)


허면 직접 maven 을 설치해서 실행하면 됩니다. (maven 3.3.3 이상 버전으로 설치 해야 합니다.)



sudo apt-get purge -y maven


$ wget http://apache.cs.utah.edu/maven/maven-3/3.3.3/binaries/apache-maven-3.3.3-bin.tar.gz


$ tar -zxf apache-maven-3.3.3-bin.tar.gz


$ sudo cp -R apache-maven-3.3.3 /usr/local


$ sudo ln -s /usr/local/apache-maven-3.3.3/bin/mvn /usr/bin/mvn


$ echo "export M2_HOME=/usr/local/apache-maven-3.3.3" >> ~/.profile


$ source ~/.profile


$ echo "Maven is on version `mvn -v`"



Maven is on version Apache Maven 3.3.3 (7994120775791599e205a5524ec3e0dfe41d4a06; 2015-04-22T20:57:37+09:00)

Maven home: /usr/local/apache-maven-3.3.3

Java version: 1.7.0_101, vendor: Oracle Corporation

Java home: /usr/lib/jvm/java-7-openjdk-amd64/jre

Default locale: en_US, platform encoding: UTF-8

OS name: "linux", version: "3.19.0-25-generic", arch: "amd64", family: "unix"



버전 확인 완료.


다시 스팍 설치 


$ mvn -Pyarn -Phadoop-2.4 -Dhadoop.version=2.4.0 -DskipTests clean package 


설치 됨!!!!


저작자 표시
신고

'Database > spark' 카테고리의 다른 글

spark maven error  (0) 2016.05.19

WRITTEN BY
No.190
세계정복의 시작점

받은 트랙백이 없고 , 댓글이 없습니다.
secret


replica set(이하 리플리카셋)은 여러 대의 서버에 원본을 복사해 두고,

장애가 발생시  자동으로 장애 이외의 디비 중 하나를 선택하여 원본 디비처럼 사용할 수 있도록 있습니다. 이로 인해 서비스를 끊기지 않고 지속적으로 유지할 수 있습니다. 

리플리카셋에서 첫번째 입력을 담당하는 서버를 primary 서버라 부르며 그밖의 서버를 secondary 서버라 부릅니다. 프라이머리 서버는 세컨더리 서버를 2초 마다 상태 체크하여 데이터 동기화를 하기 위해 HeartBeat(일종의 ping 확인)를 확인합니다. 이때 세컨더리서버가 사용할수 없더라도 프라이머리 서버는 살아있으므로 서비스는 유지 됩니다. 

만일 프라이머리 서버에 이상이 생길 경우 세컨더리서버 끼리의 선거를 통해 프라이머리서버를 선출하여 작동하게 됩니다. 이때 세컨더리->프라이머리 서버로 변환시 디비에 대한 입출력데이터는 손실될수 있습니다. 

리플리카셋 또한 샤딩과 마찬가지로 저장할 공간을 만들고 서버 셋팅만 해주면 됩니다.

 $ mkdir repl1 repl2 repl3

먼저 리플리카셋에 저장할 디렉토리를 생성합니다. 

$ sudo mongod --replSet replicasetTest -dbpath /data/repl1 -port 10000

$ sudo mongod --replSet replicasetTest -dbpath /data/repl2 -port 10001

$ sudo mongod --replSet replicasetTest -dbpath /data/repl3 -port 10002


서버를 실행하였으니 이제 접속하여 리플리카셋을 설정해 줍니다. 먼저 첫번째 서버에 접속합니다. 

$ sudo mongo localhost:10000

> var config={_id:'replicasetTest', members:[{_id:0, host:'localhost:10000'}, {_id:1, host:'localhost:10001'}, {_id:2, host:'localhost:10002'}] };

리플리카셋으로 지정할 서버들의 목록을 만들어준 후 

> rs.initiate(config);

리플리카셋으로 등록합니다. 


등록후 위와 같이 현재 첫번째 서버가 프라이머리서버가 되었음을 확인할수 있습니다. 

> exit


두번째 서버로 접속하여 확인해 보면 

$ sudo mongo localhost:10001


위와 같이 세컨더리 서버가 되었음을 확인할수 있습니다. 

>exit

$ sudo mongo localhost:10000

다시 첫번째 프라이머리 서버로 들어가서 서버를 종료시켜 보겠습니다. 

> use admin;

> db.shutdownServer();

프라이머리 서버 셧다운 후 두번째 혹은 세번째 서버로 접속해 보면 (어떤 서버가 프라이머리 서버가 됐는지는 접속해야 알수 있습니다. 서버 셋팅시 서버에 대한 우선순위를 지정하여 어떤 서버가 다음 프라이머리 서버가 될수 있도록 할수 있으나 실제 서비스 상에서는 어떤 서버가 프라이머리 서버가 되든 서비스가 죽지 않기 때문에 알 필요가 없습니다. )

$ sudo mongo localhost:10001 

혹은 

$ sudo mongo localhost:10002


저의 경우엔 세번째 서버가 프라이머리 서버가 되어 동작함을 확인 할수 있습니다. 

이렇듯 끊임없는 서비스 제공을 위해서 레플리카셋은 꼭 필요한 기능입니다. 

저작자 표시
신고

'Database > Nosql' 카테고리의 다른 글

mongodb Replica Set  (0) 2016.05.12
mongodb sharding  (0) 2016.05.11
mongodb 기본 CRUD  (0) 2016.05.10
mongodb 기초 쿼리  (0) 2013.03.03
초간단 ubuntu 에 mongodb 설치하기  (0) 2013.03.01

WRITTEN BY
No.190
세계정복의 시작점

받은 트랙백이 없고 , 댓글이 없습니다.
secret

mongodb sharding

Database/Nosql 2016.05.11 23:50


mongodb sharding( 이하 샤딩으로 표기) 은 mongodb끼리의 데이터 복제함으로서 다른 서버와의 동기화 및 빅데이터를 저장하기 위해서 분산 저장을 하는것이  샤딩의 목적입니다. 





샤딩은 mongodb 두대로도 가능하지만 최소 3대를 권장하며, 실질적인 데이터 복제가 아닌 mongodb내의 oplog에 의한 명령어를 복사/ 실행함으로서 데이터를 유지합니다. 


여기서는 한 컴퓨터에서 서버를 3대를 실행합니다.

먼저 저장소가 서로 다르게 되어야 하므로 폴더를 따로 만들어 줍니다.

$ mkdir shard1 shard2 shard3


$ sudo ./mongod -shardsvr -dbpath /data/shard1 -port 40001

$ sudo ./mongod -shardsvr -dbpath /data/shard2 -port 40002

$ sudo ./mongod -shardsvr -dbpath /data/shard3 -port 40003




총 3대의 mongo서버를 실행하며 각각 저장 폴더 경로와 포트가 달라야 합니다. 

이제 위의 3대의 샤딩 서버의 설정을 감독하는 config 서버를 만들어줍니다. config 서버는 샤딩서버들에 어떤 데이터들이 어떤 식으로 분산되는지 감독하는 기능을 합니다. 

$ mkdir config


$ sudo mongod --configsvr -dbpath /data/config -port 50001

config 서버도 폴더와 포트를 다르게 하여 실행합니다. 



$ sudo ./mongos --configdb localhost:50001 --port 50000 --chunkSize 1

이제 mongos 로 서버를 실행하는데 config의 패스와 청크파일사이즈를 지정해야 합니다. 청크파일은 파일이 저장되는 파일의 단위이며 기본 단위는 M입니다. 



이제 서버로 접속합니다. 

$ sudo ./mongo localhost:50000

기존엔 디폴트 포트로 접속하였으나 이번엔 50000포트로 지정하였으니 위와 같이 경로:포트를 지정해서 접속합니다. 

이제부터는 샤딩에 관한 설정을 해 줘야 합니다. 

> use admin;


>  db.runCommand({addshard:"localhost:40001"});

>  db.runCommand({addshard:"localhost:40002"});

>  db.runCommand({addshard:"localhost:40003"});

샤딩으로 쓰이는 서버들을 등록해 줍니다. 다음으로 샤딩할 콜렉션을 지정해 줍니다. 

> db.runCommand({ listShards : 1});

> db.runCommand({enablesharding: 'person'});

> db.runCommand({ shardcollection : 'persion.users', key :{ _id:1}});

이로써 모든 준비가 완료 되었습니다. 




이제 부터는 어떻게 샤딩이 되는지 알아보겠습니다. 

> use person;

> for(i=0; i<1000000; i++){ db.users.save({name : 'name'+i}); }

users 콜렉션에 10만개의 데이터를 집어 넣어 봅니다. ( 입력되는데 사양에 따라 시간이 걸립니다. )

> db.users.find({name:'name999'}).explain();

뒤에 explain()을 붙여주면 해당 데이터의 샤딩 정보를 보여줍니다. 




위의 이미지에서 보는 바와 같이 name999는 샤딩 서버1 / 서버2 / 서버3 모두 데이터가 있는것으로 나옵니다. 사실 3대의 서버 어느 한곳에 데이터가 있지만 분산서버이기 떄문에 한서버처럼 행동하기때문에 사용자/개발자 입장에서는 한대의 서버로 운영하는것과 같이 작동합니다. 


> sh.status();

현재 샤딩에 대한 정보를 볼수 있습니다.




위의 이미지에서 아래쪽에 chunks의 갯수가 보입니다. 각 서버의 청크(데이터단위)는 각 서버에 거의 동일하게 들어가지만 몇개의 차이가 당연히 날수 있습니다. 데이터를 분산해서 저장하기 때문에 어느 한쪽에 몇개의 데이터가 더 저장될수 있습니다. 


> use admin;

> db.runCommand({ removeshard : 'localhost:40001' });

서버1의 샤딩을 멈췄습니다. 이제 서버1에 있던 청크들은 서버2와 서버3로 최대한 균등하게 이동하게 됩니다.  콘솔창을 보시면 분주하게 복사하는게 보입니다. ( 약간의 시간이 걸립니다.)

> sh.status();





다시 샤딩의 상태를 보면 서버1에 있던 청크들이 다른 서버들로 이동하여 청크의 갯수가 달라졌음을 확인할수 있습니다. 

저작자 표시
신고

'Database > Nosql' 카테고리의 다른 글

mongodb Replica Set  (0) 2016.05.12
mongodb sharding  (0) 2016.05.11
mongodb 기본 CRUD  (0) 2016.05.10
mongodb 기초 쿼리  (0) 2013.03.03
초간단 ubuntu 에 mongodb 설치하기  (0) 2013.03.01

WRITTEN BY
No.190
세계정복의 시작점

받은 트랙백이 없고 , 댓글이 없습니다.
secret



1. insert (save)

>  db.scores.save({num:99}); 

db.scores.save({num:99}) -> scores 콜렉션에 num:99 를 넣으시요. 

데이터 확인 find()

db.scores.find();


db.scores.find(); -> scores 콜렉션에 있는 모든 데이터를 가져오시오.


>  for(i=0; i<10; i++){ db.scores.save({num:i, name:"name"+i}); }

scores에 num과 name 값을 열번 넣으시요.

db.scores.find();





2. Read (find)


> db.scores.find({num:0});

db.scores.find({num:0}); -> num이 0인것을 찾으시오

_id는 mongodb가 각각의 데이터에 부여하는 객체 id 값 입니다. (고유값) 해당 id로 찾기 위해선 objectid 로 변환해줘야 합니다. 





db.scores.find( {num: {$gt:5}} );

db.scores.find({num: {$gt:5}}); -> num의 값중 5보다 큰값을 찾으시오.



db.scores.find( {num: {$lt:5}} );

db.scores.find({num: {$lt:5}}); -> num의 값중 5보다 작은 값을 찾으시오.



db.scores.find({num: {$gte:5, $lte:7}});

db.scores.find({num: {$gte:5, $lte:7}}); -> num의 값중 5보다 크거나 같으며 7보다 작거나 같은 값들을 찾으시오.


db.scores.find({ $or : [{num : {$gt: 1, $lt : 3} }, { num : {$gte: 7, $lt : 9}}] });

db.scores.find({ $or : [{num : {$gt: 1, $lt : 3} }, { num : {$gte: 7, $lt : 9}}] });

-> num에서 1보다 크며 3보다 작은 값과 7보다 크거나 같으며 9보다 작은 값들을 모두 보여주시오. 



db.scores.find({ num : { $in : [0, 99]} });

db.scores.find({ num : { $in : [0, 99]} }); -> num의 값중 0과 99인 값을 찾아 보여주시오.


db.scores.find({ num : { $nin : [0, 99]} });

db.scores.find({ num : { $nin : [0, 99]} }); -> num의 값중 0과 99인 값을 제외한 값을 찾아 보여주시오.





3. Update 


db.scores.update({num: 9} , {num: 9, name : "name99"});

db.scores.update({num: 9} , {num: 9, name : "name99"}); -> num이 9 인 데이터의 name를 name99로 변경하시오.



4. Delete(remove)


db.scores.remove({num:99});

db.scores.remove({num:99}); -> num이 99인 값을 삭제하시오.



저작자 표시
신고

'Database > Nosql' 카테고리의 다른 글

mongodb Replica Set  (0) 2016.05.12
mongodb sharding  (0) 2016.05.11
mongodb 기본 CRUD  (0) 2016.05.10
mongodb 기초 쿼리  (0) 2013.03.03
초간단 ubuntu 에 mongodb 설치하기  (0) 2013.03.01

WRITTEN BY
No.190
세계정복의 시작점

받은 트랙백이 없고 , 댓글이 없습니다.
secret



만일 mysql 이 설치가 되었고 ps -ef | grep mysql 현 상태에서 서비스가 실행중이라면 

실행하고 다시 접속하면 정상적으로 실행된다. 

<pre class="brush:javascript">

mysqld_safe --user=root &

</pre>



저작자 표시
신고

WRITTEN BY
No.190
세계정복의 시작점

받은 트랙백이 없고 , 댓글이 없습니다.
secret

상세하게 쓸려고 미친듯이 포스팅을 했으나....


사이트에서 제공하는 예제보다 잘할 자신이 없어서 포기....


http://docs.mongodb.org/manual/reference/sql-comparison/


정말 잘 나왔으니 한번씩 따라해보세요.





저작자 표시
신고

'Database > Nosql' 카테고리의 다른 글

mongodb Replica Set  (0) 2016.05.12
mongodb sharding  (0) 2016.05.11
mongodb 기본 CRUD  (0) 2016.05.10
mongodb 기초 쿼리  (0) 2013.03.03
초간단 ubuntu 에 mongodb 설치하기  (0) 2013.03.01

WRITTEN BY
No.190
세계정복의 시작점

받은 트랙백이 없고 , 댓글이 없습니다.
secret

초간단! 우분투에 mongodb 설치 하기 입니다.


1. 다른 패키지 설치 처럼 apt-get명령어로 설치 가능합니다.

$ sudo apt-get install mongodb


2. 엄청 많은 패키지들이 필요하군요.. 설치를 계속 할것인지 묻습니다.

당연히 Y


3. 쭉쭉 설치가 되다가 mongodb statr/running 라는 말이 나옵니다.

정상적으로 작동하는군요. 설치 완료입니다.ㅎ 참쉽죠?


4. mongodb 를 실행하고 싶다면 mongo명령어를 실행하면됩니다.

$ mongo


-이제부터가 mongodb의 시작입니다.



저작자 표시
신고

'Database > Nosql' 카테고리의 다른 글

mongodb Replica Set  (0) 2016.05.12
mongodb sharding  (0) 2016.05.11
mongodb 기본 CRUD  (0) 2016.05.10
mongodb 기초 쿼리  (0) 2013.03.03
초간단 ubuntu 에 mongodb 설치하기  (0) 2013.03.01

WRITTEN BY
No.190
세계정복의 시작점

받은 트랙백이 없고 , 댓글이 없습니다.
secret

두개의 테이블에서 각각 한개의 칼럼을 비교하여 없는것을 찾는 조인이 부정형 조인 / 안티 조인이라 한다.


 두개의 테이블 A , B 가 아래와 같이 있다고 하자.                 

만일  A not in (B) 를 한다면 결과 값은 bbb 가 나오게 된다.

만일 B not in (A) 가 된다면? 아래의 그림처럼 ccc, ddd 가 나오게 된다.





소스는 심플하다.



select 

distinct a.id , a.name

from A a

where 

 a.id is not null

 and a.id not in (select /*+ HASH_AJ*/  id  from B  where id is not null)


 - 오라클 11g부터는 not null을 명시 하지 않아도 된다. 그전 버전을 사용한다면 꼭 not null을 넣어주기 바랍니다.(결과값이 달라집니다.)

- 실행계획은 강제적으로 /*+ HASH_AJ*/ 을 넣었습니다. 명시 하지 않으면 다르게 실행될 가능성이 있습니다.




저작자 표시
신고

WRITTEN BY
No.190
세계정복의 시작점

받은 트랙백이 없고 , 댓글이 없습니다.
secret