블로그 이미지
푸른_바람

Rss feed Tistory
IT/DB 2012/01/04 18:38

오라클 트리거

저작자 표시 비영리 동일 조건 변경 허락

'IT > DB' 카테고리의 다른 글

오라클 트리거  (0) 2012/01/04
TOAD 단축키  (0) 2011/04/14
mysql 날짜지정 자동업데이트 컬럼  (0) 2010/12/24
mysql "Incorrect information in file: './database/table.frm'"  (0) 2010/12/23
mysql talbe stauts 정보  (0) 2010/12/17
mysql 프로시저 insert into GeoLiteCityBlock  (0) 2010/12/09
IT/DB 2011/04/14 09:49

TOAD 단축키

침고 : Toad Oracle 설명

테이블 정보 상세보기
F4 : Table, View, Proc, Funct, Package를 DESC(테이블명 위에 커서를 두고 F4키)
 
자동완성
Ctrl+. : Table Completion (매칭되는 테이블목록 출력)
Ctrl+T : Columns Dropdown (해당테이블의 컬럼목록 표시)
 
SQL문 실행
F5 : SQL Editor내의 모든 SQL문 실행
Ctrl+Enter : 현재 커서의 SQL문 실행
F9 : SQL문 실행 후 Grid에 출력
 
히스토리(과거 수행SQL문 조회)
F8 : 과거에 실행한SQL문 HISTORY 목록
Alt+Up : History UP
Alt+Down : History DOWN
 
텍스트 대/소문자 변환
CTRL+L : 텍스트를 소문자로
CTRL+U : 텍스트를 대문자로
 
주석처리
Ctrl+B : 주석처리
Ctrl+Shift+B : 주석해제
 
편집 창 전환(이동)
F6 : SQL Editor와 결과창간의 이동
F2 : SQL Editor창 전체화면 전환
Shift+F2 : Grid Output창 전체화면 전환
 
기타 단축키
F7 : 화면을 모두 CLEAR
Ctrl+Shift+F : 쿼리문을 보기좋게 정렬
Ctrl+F9 : SQL문 Validate (SQL문을 수행하지 않음)

'IT > DB' 카테고리의 다른 글

오라클 트리거  (0) 2012/01/04
TOAD 단축키  (0) 2011/04/14
mysql 날짜지정 자동업데이트 컬럼  (0) 2010/12/24
mysql "Incorrect information in file: './database/table.frm'"  (0) 2010/12/23
mysql talbe stauts 정보  (0) 2010/12/17
mysql 프로시저 insert into GeoLiteCityBlock  (0) 2010/12/09
오라클
IT/DB 2010/12/24 08:30

mysql 날짜지정 자동업데이트 컬럼

참고

TIMESTAMP 데이터 형을 사용할 경우에는
DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 속성을 분명히 명시하던가
아니면 DEFAULT '0000-00-00 00:00:00' 라고 값을 명시해야 안 헷갈린다는 것이다.

 

'IT > DB' 카테고리의 다른 글

오라클 트리거  (0) 2012/01/04
TOAD 단축키  (0) 2011/04/14
mysql 날짜지정 자동업데이트 컬럼  (0) 2010/12/24
mysql "Incorrect information in file: './database/table.frm'"  (0) 2010/12/23
mysql talbe stauts 정보  (0) 2010/12/17
mysql 프로시저 insert into GeoLiteCityBlock  (0) 2010/12/09
IT/DB 2010/12/23 08:30

mysql "Incorrect information in file: './database/table.frm'"

참고

http://www.scotthodson.com/blog/index.php/restoring-mysql-databases-without-a-mysqldump-backup/

원리는 다음과 같다.

MySQL에서 innoDB는 기본적으로 ibdata1 에 데이터를 저장하며, ib_logfileX 에 로그를 저장한다.

위와 같은 에러가 나는 경우는 MySQL Engine에서 새로운 설정 파라미터로 예전 로그들을 읽으려고 하면 발생하는 것이다.

따라서, 정상적으로 MySQL을 Restart한 경우 (로그 파일에 별 내용이 없을 경우로 가정하고,)

그냥 로그파일을 삭제하고, MySQL을 재시작하면 된다.

위의 방법으로 문제는 해결되었고, MySQL도 새로 설정된 파라미터로 잘 돌아가고 있는 것 같다.


위 내용으로 logfile을 삭제했지만 오류는 그대로나옴.


하지만 DB table을 확인했을때의 허탈함이란.  DB의 테이블 목록만 뜨고 모든 정보가 날아간것 같다. ㅜ.ㅜ

frm 파일 정보와 ibdata1 파일은 정상적으로 존재한다. 뭔가 잘못된거다. 다시 구글링을 해야겠다. 에궁.

'IT > DB' 카테고리의 다른 글

TOAD 단축키  (0) 2011/04/14
mysql 날짜지정 자동업데이트 컬럼  (0) 2010/12/24
mysql "Incorrect information in file: './database/table.frm'"  (0) 2010/12/23
mysql talbe stauts 정보  (0) 2010/12/17
mysql 프로시저 insert into GeoLiteCityBlock  (0) 2010/12/09
리눅스 모델링툴  (0) 2010/12/01
IT/DB 2010/12/17 08:30

mysql talbe stauts 정보

참고

 SHOW TABLE STATUS 는 다음 필드를 리턴한다:

  • Name

테이블 이름

  • Engine

테이블의 스토리지 엔진. "14. 스토리지 엔진과 테이블 타입"장을 참조하라.

  • Version

테이블의 .frm 파일의 버전 수.

  • Row_format

로우 스토리지 포맷(Fixed, Dynamic, Compressed, Redundant, Compact).
MySQL/InnoDB 5.0.3
부터 InnoDB 테이블의 포맷은 Redundant 
또는 Compact 형식으로 보고된다. 5.0.3이전 버전에서 InnoDB 테이블은
항상
Redundant 포맷에 있었다.  

  • Rows

로우의 수. MyISAM과 같은 몇몇 스토리지 엔진은 정확한 값을 저장한다.
InnoDB
와 같은 다른 스토리지 엔진의 경우, 이 값은 근사값이며, 실제 값과는 
40~50%
이상 차이가 있다. 그런 경우, 정확한 값을 얻기 위해서
SELECT COUNT(*)
를 사용한다. INFORMATION_SCHEMA 데이터 베이스에 있는 테이블에서 Rows 
값은 NULL 이다.

  • Avg_row_length

평균 로우 길이.

  • Data_length

데이터 파일의 길이.

  • Max_data_length

데이터 파일의 최대 길이. 이것은 테이블에 저장된 데이터의 바이트 총수이다.

  • Index_length

인덱스 파일의 길이.

  • Data_free

할당되었으나 사용되지 않은 바이트 수.

  • Auto_increment

그 다음 AUTO_INCREMENT .

  • Create_time

테이블이 생성되었을 때.

  • Update_time

데이터 파일이 마지막으로 업데이트된 때. 몇몇 스토리지 엔진의 경우, 이 값은 NULL
이다.예를 들어, InnoDB는 테이블스페이스에 있는 복합 테이블을 저장하고 데이터
파일 타임스탬프는 적용되지 않는다.

  • Check_time

테이블이 마지막으로 체크된 때. 모든 스토리지 엔진이 이 시간에 업데이트되는 것은
아니다. 이런 경우 값은 항상 NULL이다.

  • Collation

테이블의 캐릭터 셋과 정렬.

  • Checksum

유요한 검사 합계 값.

  • Create_options

CREATE TABLE 을 사용한 별도 옵션.

  • Comment

테이블을 생성할 때 사용하는 코멘트
(또는 MySQL이 테이블 정보에 엑세스할 수 없는 이유에 관한 정보)

 
mysql, show, status, Table
IT/DB 2010/12/09 08:30

mysql 프로시저 insert into GeoLiteCityBlock

참고

테이블 정보
[code sql]
-- 지역 IP 대역 정보 CREATE TABLE `GeoLiteCityBlocks` ( `startIPNum` int(10) unsigned NOT NULL, `endIPNum` int(10) unsigned NOT NULL, `locID` int(10) unsigned NOT NULL, PRIMARY KEY (`startIPNum`,`endIPNum`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='지역IP대역 '$$ -- 지역정보 CREATE TABLE `GeoLiteCityLocation` ( `locID` int(10) unsigned NOT NULL, `country` char(2) default NULL, `region` char(2) default NULL, `city` varchar(45) default NULL, `postalCode` char(7) default NULL, `latitude` double default NULL, `longitude` double default NULL, `dmaCode` char(3) default NULL, `areaCode` char(3) default NULL, PRIMARY KEY (`locID`), KEY `idx_GeoLiteCity-Location` (`country`,`region`,`city`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='지역정보 '$$ -- IP별 지역 연결정보 CREATE TABLE `GeoLiteCityBlock` ( `addr` int(10) unsigned NOT NULL, `locID` int(10) unsigned NOT NULL, PRIMARY KEY (`addr`), KEY `idx_GeoListCityBlock` (`locID`), KEY `fk_GeoLiteCityBlock:locID` (`locID`), CONSTRAINT `fk_GeoLiteCityBlock:locID` FOREIGN KEY (`locID`) REFERENCES `GeoLiteCityLocation` (`locID`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8$$ [/code]

IP별 지역정보를 연결한 자료를 테이블에 밀어넣기
[code sql]
DELIMITER $$ CREATE DEFINER=`pickup`@`` PROCEDURE `geo`() BEGIN DECLARE cur_state INT DEFAULT 0; DECLARE startIPNum INT DEFAULT 0; DECLARE endIPNum INT DEFAULT 0; DECLARE locID INT DEFAULT 0; DECLARE cur CURSOR FOR SELECT * FROM sta.GeoLiteCityBlocks WHERE startIPNum >= (SELECT if(count(addr)=0, 0, addr) as startIPNum FROM sta.GeoLiteCityBlock ORDER BY addr DESC LIMIT 1) ORDER BY startIPNum ASC LIMIT 1000; DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET cur_state = 1; OPEN cur; REPEAT FETCH cur INTO startIPNum, endIPNum, locID; IF NOT cur_state THEN WHILE startIPNum <= endIPNum DO INSERT INTO sta.GeoLiteCityBlock VALUES (startIPNum, locID); SET startIPNum = startIPNum+1; END WHILE; END IF; UNTIL cur_state END REPEAT; CLOSE cur; END[/code]

[code sql] -- 프로시저 실행 call geo(); [/code]

하나의 IP 주소에대한 지역정보를 찾을 경우에는 MaxMind 에서 제공하는 쿼리로 문제없이 동작한다.
[code sql]
SELECT ip_country FROM geoip WHERE 404232216 >= begin_ip_num AND 404232216 <= end_ip_num LIMIT 1 [/code]

하지만 IP Row 수가 100단위 이상 넘어갈 경우 쿼리 결과는 수십초를 넘은 실행시간을 잡아 먹는 관계로 결국은 IP와 locID간의 1:1 조건을 만족시키고 join으로 0.00x 대의 쿼리 실행시간을 위해서 GeoLiteCityBlock 테이블을 구성하고 IP:locID 정보를 밀어넣는 프로시저를 만들고 자료를 밀어 넣게 되었습니다.

하지만 쓸데없는 Table 아닐까하는 생각도 드네요.


결국은 현재 통계에 쌓여있는 IP와 Geo 자료 매핑테이블을 만들기로 했습니다.
이렇게밖에 할 수 없는 이유는 INT(4 byte)로 addr과 locID 2개의 필드에 최소 16777216 에서 최대 3758095359까지의 자료를 넣을 경우 2개 필드 평균 4 byte 의 저장공간을 확보한다해도 (3,758,095,359 - 16,777,216)*4 = 14,965,272,572 byte (약 14Gbyte ) 의 자료공간을 차지하게 됩니다. 거기에 인덱스 자료까지 생각한다면 공간낭비라 생각되는군요.

거기에다 16777216 ~ 3758095359 까지 INT형으로 PK 자료만 넣는데도 엄청난 시간이 소유되는군요. 약 25백만건의 자료를 프로시저로 addr과 locID 필드 자료를 넣는데 만 하루 이상이 소요되었습니다.

이걸 한방에 빠르게 해결할 수 있는 방법이 없을까 생각해 봤지만... 아직 저에겐 무리군요.. ^^;;

[code sql]
DELIMITER $$ CREATE DEFINER=`pickup`@`` PROCEDURE `geo`() BEGIN DECLARE cur_state INT DEFAULT 0; DECLARE addr INT DEFAULT 0; DECLARE cur CURSOR FOR SELECT su.addr FROM sta.sta_uri AS su WHERE su.addr NOT IN (SELECT addr FROM sta.GeoLiteCityBlock) ORDER BY su.addr; DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET cur_state = 1; OPEN cur; REPEAT FETCH cur INTO addr; IF NOT cur_state THEN INSERT INTO sta.GeoLiteCityBlock SELECT addr, `locID` FROM sta.GeoLiteCityBlocks WHERE addr BETWEEN startIPNum AND endIPNum LIMIT 1 ON DUPLICATE KEY UPDATE locID=VALUES(locID); END IF; UNTIL cur_state END REPEAT; CLOSE cur; END [/code]

결국 위 프로시저는 아래 쿼리 한번으로 해결되는건데...
[code sql]
INSERT INTO sta.GeoLiteCityBlock SELECT su.addr, geob.locID FROM sta.sta_uri AS su LEFT JOIN sta.GeoLiteCityBlocks AS geob ON su.addr BETWEEN geob.startIPNum AND geob.endIPNum WHERE su.addr NOT IN (SELECT addr FROM sta.GeoLiteCityBlock) GROUP BY su.addr [/code]
Geo, GeoLiteCity, IP
IT/DB 2010/12/01 08:30

리눅스 모델링툴

참고

  1. DIA 도표편집 프로그램

    dia Screenshots - Dia is free software/open source general-purpose ...

    이미지출처 : ostatic.com

  2. Google - wwwsqldesigner - Project Hosting on Google Code
    IanLewis / django-wwwsqldesigner / wiki / Home – Bitbucket

    이미지출처 : bitbucket.org


  3. Oracle - sqlDeveloper

    SQL Developer Main Window - Jan Borchers - SQL Developer is a is a ...

    이미지출처 : pcwin.com

  4. MySQL - MySQL Workbench 5.2
    MySQL Workbench - MySQL Forge Wiki

    이미지출처 : forge.mysql.com


  5. starUML - http://staruml.sourceforge.net/en/ , StarUML 5.0 개발자 가이드

    Survey of Open Source Modeling Tools for Software Development | Wazi

    이미지출처 : olex.openlogic.com



개발중인 서비스는 mysql을 사용하고 있어서 workbench를 애용하고 있습니다. 하지만 workbench 의 기능과 약간의 버그들이 모델링에서 나의 발걸음을 막는군요.
IT/DB 2010/11/22 08:30

과거자료를 포기못해 자료이전을 고집하는 지금

현재 통계자료를 이전하고 있다.

새로운 모델을 제시하려고 하지만 원래 DB모델링에 전문가도 아니니 이게 맞다 저게 맞다고 확신할 수도 없다.

어떻게 해야 할까?

현재 작업중이 새로운 모델은 과거의 자료를 포기하지 못한 결과물이다.

하지만 지인분의 얘기를 듣고는 아하! 돌을 깨우쳤다. 왜? 과거자료에 연연을 할까? 새로운 방식으로 옮겨가고 과거자료는 과자자료대로 보여주든지 아니면 버리면 될것을...
하지만 벌써 50%나 지나갔는데...

일정부분 취할건 취하고 버릴건 버린다면 좀더 편하지 않을까? 생각해본다.
IT/DB 2010/11/18 08:30

mysql - user error: Can't create/write to file '/tmp/xxx'

에러 내용
Error Code: 3
Error writing file '/home/uncaose/tmp/MYggXeGS' (Errcode: 27)


참고


5천만건 이상의 테이블을 리모링을 위해서 group by count 결과를 insert into select 로 쿼리 질의를 날리면 tmp 파일 생성에 문제가 생긴다.

하지만 해결 방법은 구글링을 해도 아직 찾지 못했다. ㅜ.ㅜ

결과는 에러고 문제점이 무엇인지 정확한 파악이 안되니 우물가에서 숭늉찾는 식의 뻘짓이 계속된다.

이런 된장.

정확한 에러원일을 다시 찾으니 tmp 파일이 너무 커서 에러가 났단다.

mysql ErrCode
Error code 27: 파일이 너무 큽니다

문제점을 확인한 자료 : Large files support is disabled, large-pages option is broken

안되는 영어로 알아본 결과 mysql 설치시 large-pages 옵션을 설정해서 대용량 파일을 사용할 수 있도록 설치하라...


How to repeat:
# Start server with default configuration
# (or at least without --large-pages option)

 SELECT @@large_files_support
# 0

Suggested fix:
Vladislav Vaintroub wrote:

patch below fixes typo in sys_vars.cc and makes large_files ON for me

=== modified file 'sql/sys_vars.cc'
--- sql/sys_vars.cc 2010-03-15 13:52:25 +0000
+++ sql/sys_vars.cc 2010-04-09 04:44:45 +0000
@@ -859,7 +859,7 @@


[code c++]
 static Sys_var_mybool Sys_large_pages( "large_pages", "Enable support for large pages", - READ_ONLY GLOBAL_VAR(opt_large_files), + READ_ONLY GLOBAL_VAR(opt_large_pages), IF_WIN(NO_CMD_LINE, CMD_LINE(OPT_ARG)), DEFAULT(FALSE)); static Sys_var_charptr Sys_language(~~~~
[/code]
위 코드를 볼때 결국은 소스파일을 수정하고 다시 컴파일해서 설치하라는 소리다. 에궁..


그냥 쉽게 월/별로 쪼개서 하고 만다. 자료만 밀어넣는데 1주일이 걸렸구먼... 난 DBA가 아니란 말이다.
엉엉엉 ㅠ.ㅠ


IT/DB 2010/11/10 08:30

mysql "The total number of locks exceeds the lock table size"

참고
[code xml]
# mysql "The total number of locks exceeds the lock table size"
[mysqld]
set-variable=innodb_buffer_pool_size=512M
[/code]
TOTAL 245,655 TODAY 22