블로그 이미지
푸른_바람

Rss feed Tistory
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/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]
IT/DB 2010/11/08 08:30

mysql 쿼리 자료 OUTFILE INFILE query

참고
[code bash]
mysql -u root -p
[/code]

[code sql]
SELECT a,b,a+b INTO OUTFILE '/home/username/backup.data'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM table_name
WHERE a > 0;

LOAD DATA INFIILE '/home/username/backup.data'
INTO TABLE database_name.table_name;
[/code]
IT/DB 2010/10/28 00:22

마이그레이션 이런된장

인덱스가 제대로 걸려있지도 않고, 제대로 모델링도 안한 5천만건 이상의 통계 테이블을 마이그레이션하기 위해서 열심히 인덱스를 걸고 자료를 구축한 테스트 DB가 뻑났다.

이런 된장. 되는일이 없네.
IT/DB 2010/10/27 08:30

mysql 통계자료 이전을 위한 agent 자료 구축

약 5천만건 이상의 자료중 agent 정보가 있은 http_user_agent 필드에 인덱스가 걸려있지 않아서 운영서버 작업이 불가능한 상태.

TEST 서버에 DB를 와 TABLE을 다시 구축한후 작업에 필요한 필드에 인덱스를 건 후 자료를 밀어넣었더니 이틀정도의 시간이 소요되더군요. ㅡ.ㅡa

그 후 agent를 uniq로 뽑아 낸 후 php에서 제공하는 get_browser(); 로 agent를 정보를 갱신하는 작업을 진행했습니다.

막노동이 따로없군요.

mysql 자체에서는 agent정보를 기초로 브라우저, 버전, 플랫폼, 모바일, 크롤러 정보를 뽑아주는 기능이 있는지 검색을 열심히(!) 해 봤지만 없더군요.
 

[code sql]
INSERT INTO sta.agent ( agent_md5, agent_name ) SELECT md5(a.http_user_agent), a.http_user_agent FROM p.analy AS a WHERE a.http_user_agentt IS NOT NULL AND a.http_user_agent != '' AND a.http_user_agentt NOT IN ( SELECT agent_name FROM sta.agent ) GROUP BY a.http_user_agentt[/code]
[code php]
#!/opt/lampp/bin/php -q {$agent_idx}"; $qry .= " LIMIT 1000"; $rs = $mysqli->query($qry) or die(__LINE__.' : '.$mysqli->error."\n"); if($mysqli->affected_rows < 1) { echo $qry."\n"; echo "fatch rows : ".$mysqli->affected_rows."\n"; break; } $sql = ''; while($row = $rs->fetch_assoc()) { $agent = (! empty($row['agent_name']))?get_browser($row['agent_name'], TRUE):Array(); $sql .= "UPDATE agent SET browser_name='{$agent['browser']}', browser_version='{$agent['version']}', platform_name='{$agent['platform']}', mobile='{$agent['ismobiledevice']}', crawler='{$agent['crawler']}' WHERE agent_idx = {$row['agent_idx']} ;"; $agent_idx = $row['agent_idx']; if($i%100 == 0){ $sql = str_replace("=''", '=NULL', $sql); $sql = str_replace("\n", '', $sql); $sql = str_replace(" ", '', $sql); $sql = str_replace(";", ";\n", $sql); $mysqli->multi_query( $sql ); echo "{$i}({$agent_idx}) fatch ".$mysqli->affected_rows."\n"; // echo $sql; $sql = ''; } $i++; } $rs->free_result(); $mysqli->close(); echo "agent idx : {$agent_idx} fatch executed !!\n"; } /* * End of file */
[/code]
IT/DB 2010/10/26 08:30

mysql 통계자료 이전 쿼리

[code sql]
INSERT INTO sta.sta SELECT CONCAT( replace(IF(a._request_time IS NOT NULL, DATE(FROM_UNIXTIME(a._request_time)), DATE(CONCAT(a.request_year, '-', a.request_month, '-', a.request_day)) ), '-', '') , IF(mem_idx IS NOT NULL, CONCAT('-', mem_idx), '-' ) , IF(uri_idx IS NOT NULL, CONCAT('-', uri_idx), '-' ) , IF(browser_idx IS NOT NULL, CONCAT('-', browser_idx), '-') , IF(host_idx IS NOT NULL, CONCAT('-', host_idx), '-') , IF(platform_idx IS NOT NULL, CONCAT('-', platform_idx), '-') , IF(ref_idx IS NOT NULL, CONCAT('-', ref_idx), '-') , IF(req_idx IS NOT NULL, CONCAT('-', req_idx), '-') , IF(mobile IS NOT NULL, CONCAT('-', mobile), '-') , IF(crawler IS NOT NULL, CONCAT('-', crawler), '-') , IF(remote_addr IS NOT NULL, CONCAT('-', INET_ATON(remote_addr)), '-') ) AS sta_idx ,IF(a._request_time!=NULL, DATE(FROM_UNIXTIME(a._request_time)), DATE(CONCAT(a.request_year, '-', a.request_month, '-', a.request_day)) ) AS sta_date ,mem_idx ,uri_idx ,browser_idx ,host_idx ,platform_idx ,ref_idx ,req_idx ,mobile ,crawler ,INET_ATON(a.remote_addr) AS addr ,count(*) AS cnt FROM pickup.analysis AS a LEFT JOIN sta.agent ON agent.agent_md5=md5(a.http_user_agent) AND agent.agent_name=a.http_user_agent LEFT JOIN sta.browser ON browser.browser_name=CONCAT(agent.browser_name, IF(agent.browser_version='0', NULL, CONCAT(' ', agent.browser_version))) LEFT JOIN sta.platform ON platform.platform_name=agent.platform_name LEFT JOIN sta.host ON host.host_name=a.remote_host LEFT JOIN sta.ref ON ref.ref_md5=md5(a.http_referer) AND ref.ref_uri=a.http_referer LEFT JOIN sta.req ON req.req_md5=md5(IF(substr(a.request_uri, 0, 2)='//', substr(a.request_uri, 1), a.request_uri)) WHERE a.analysis_idx > 0 AND a.analysis_idx < 100000 GROUP BY sta_idx --ON DUPLICATE KEY UPDATE sta_cnt=sta_cnt+cnt -- cnt 는 적용이 안됨.
[/code]

아 하하... 부끄러워라...
[code sql]
INSERT INTO sta.sta SELECT *, count(sta_idx) FROM ( SELECT LOWER( CONCAT(CONV(CONCAT(REPLACE(IF(a._request_time IS NOT NULL, DATE(FROM_UNIXTIME(a._request_time)), CONCAT(a.request_year, a.request_month, a.request_day)),'-', ''), CASE WHEN HOUR(FROM_UNIXTIME(a._request_time)) IS NOT NULL THEN HOUR(FROM_UNIXTIME(a._request_time)) ELSE '0' END), 10, 36) , CONCAT('-', CASE WHEN conv(mem_idx, 10, 36) IS NOT NULL THEN conv(mem_idx, 10, 36) ELSE '0' END) , CONCAT('-', CASE WHEN conv(uri_idx, 10, 36) IS NOT NULL THEN conv(uri_idx, 10, 36) ELSE '0' END) , CONCAT('-', CASE WHEN conv(host_idx, 10, 36) IS NOT NULL THEN conv(host_idx, 10, 36) ELSE '0' END) , CONCAT('-', CASE WHEN conv(ref_idx, 10, 36) IS NOT NULL THEN conv(ref_idx, 10, 36) ELSE '0' END) , CONCAT('-', CASE WHEN conv(req_idx, 10, 36) IS NOT NULL THEN conv(req_idx, 10, 36) ELSE '0' END) , CONCAT('-', CASE WHEN conv(agent_idx, 10, 36) IS NOT NULL THEN conv(agent_idx, 10, 36) ELSE '0' END) , CONCAT('-', CASE WHEN conv(INET_ATON(remote_addr), 10, 36) IS NOT NULL THEN conv(INET_ATON(remote_addr), 10, 36) ELSE '0' END) )) AS sta_idx ,IF(a._request_time IS NOT NULL, YEAR(FROM_UNIXTIME(a._request_time)), a.request_year ) AS sta_y ,IF(a._request_time IS NOT NULL, MONTH(FROM_UNIXTIME(a._request_time)), a.request_month ) AS sta_m ,IF(a._request_time IS NOT NULL, DAY(FROM_UNIXTIME(a._request_time)), a.request_day ) AS sta_d ,IF(a._request_time IS NOT NULL, HOUR(FROM_UNIXTIME(a._request_time)), '0' ) AS sta_h ,mem_idx ,uri_idx ,host_idx ,ref_idx ,req_idx ,agent_idx ,INET_ATON(a.remote_addr) AS addr FROM pickup.analysis AS a LEFT JOIN sta.agent ON agent.agent_md5=md5(a.http_user_agent) LEFT JOIN sta.host ON host.host_name=a.remote_host LEFT JOIN sta.ref ON ref.ref_md5=md5(a.http_referer) AND ref.ref_uri=a.http_referer LEFT JOIN sta.req ON req.req_md5=md5(IF(substr(a.request_uri, 0, 2)='//', substr(a.request_uri, 1), a.request_uri)) WHERE #a.analysis_idx < 14463 a.request_year = '2010' and a.request_month = '1' #and a.request_day >= '1' and a.request_day <= '15' GROUP BY a.analysis_idx ) AS tmp GROUP BY sta_idx [/code]

DBA는 아무나 하는것도 아닌가봐.
[code sql]
INSERT INTO sta.sta SELECT LOWER(CONCAT( CONV(CONCAT(sta_y, sta_m, sta_d, sta_h) , 10, 36) , CONCAT('-', CASE WHEN conv(mem_idx, 10, 36) IS NOT NULL THEN conv(mem_idx, 10, 36) ELSE '0' END) , CONCAT('-', CASE WHEN conv(uri_idx, 10, 36) IS NOT NULL THEN conv(uri_idx, 10, 36) ELSE '0' END) , CONCAT('-', CASE WHEN conv(host_idx, 10, 36) IS NOT NULL THEN conv(host_idx, 10, 36) ELSE '0' END) , CONCAT('-', CASE WHEN conv(ref_idx, 10, 36) IS NOT NULL THEN conv(ref_idx, 10, 36) ELSE '0' END) , CONCAT('-', CASE WHEN conv(req_idx, 10, 36) IS NOT NULL THEN conv(req_idx, 10, 36) ELSE '0' END) , CONCAT('-', CASE WHEN conv(agent_idx, 10, 36) IS NOT NULL THEN conv(agent_idx, 10, 36) ELSE '0' END) , CONCAT('-', CASE WHEN conv(addr, 10, 36) IS NOT NULL THEN conv(addr, 10, 36) ELSE '0' END) )) AS sta_idx , tmp.* , count(*) as sta_cnt FROM ( SELECT IF(a._request_time IS NOT NULL, YEAR(FROM_UNIXTIME(a._request_time)), a.request_year ) AS sta_y ,IF(a._request_time IS NOT NULL, MONTH(FROM_UNIXTIME(a._request_time)), a.request_month ) AS sta_m ,IF(a._request_time IS NOT NULL, DAY(FROM_UNIXTIME(a._request_time)), a.request_day ) AS sta_d ,IF(a._request_time IS NOT NULL, HOUR(FROM_UNIXTIME(a._request_time)), '0' ) AS sta_h ,mem_idx ,uri_idx ,(SELECT host_idx FROM sta.host WHERE host.host_name=a.remote_host LIMIT 1) AS host_idx ,(SELECT ref_idx FROM sta.ref WHERE ref.ref_md5=md5(a.http_referer) AND ref.ref_uri=a.http_referer) AS ref_idx ,(SELECT req_idx FROM sta.req WHERE req.req_md5=md5(IF(substr(a.request_uri, 0, 2)='//', substr(a.request_uri, 1), a.request_uri)) LIMIT 1) AS req_idx ,(SELECT agent_idx FROM sta.agent WHERE agent.agent_md5=md5(a.http_user_agent) LIMIT 1) AS agent_idx ,INET_ATON(a.remote_addr) AS addr FROM pickup.analysis AS a WHERE a.request_year = '2010' and a.request_month = '2' ) AS tmp GROUP BY sta_idx [/code]

[code sql]
INSERT INTO sta.sta SELECT LOWER(CONCAT( CONV(CONCAT(sta_y, sta_m, sta_d, sta_h) , 10, 36) , '-', IFNULL(CONV(mem_idx, 10, 36), 0) , '-', IFNULL(CONV(uri_idx, 10, 36), 0) , '-', IFNULL(CONV(host_idx, 10, 36), 0) , '-', IFNULL(CONV(ref_idx, 10, 36), 0) , '-', IFNULL(CONV(req_idx, 10, 36), 0) , '-', IFNULL(CONV(agent_idx, 10, 36), 0) , '-', IFNULL(CONV(addr, 10, 36), 0) )) AS sta_idx , tmp.* , count(*) as sta_cnt FROM ( SELECT IFNULL(YEAR(FROM_UNIXTIME(a._request_time)), a.request_year) AS sta_y ,IFNULL(MONTH(FROM_UNIXTIME(a._request_time)), a.request_month) AS sta_m ,IFNULL(DAY(FROM_UNIXTIME(a._request_time)), a.request_day) AS sta_d ,IFNULL(HOUR(FROM_UNIXTIME(a._request_time)), '0') AS sta_h ,mem_idx ,uri_idx ,(SELECT host_idx FROM sta.host WHERE host.host_name=a.remote_host LIMIT 1) AS host_idx ,(SELECT ref_idx FROM sta.ref WHERE ref.ref_md5=md5(a.http_referer) AND ref.ref_uri=a.http_referer) AS ref_idx ,(SELECT req_idx FROM sta.req WHERE req.req_md5=md5(IF(substr(a.request_uri, 0, 2)='//', substr(a.request_uri, 1), a.request_uri)) LIMIT 1) AS req_idx ,(SELECT agent_idx FROM sta.agent WHERE agent.agent_md5=md5(a.http_user_agent) LIMIT 1) AS agent_idx ,INET_ATON(a.remote_addr) AS addr FROM pickup.analysis AS a WHERE a.request_year = '2010' and a.request_month = '5' ) AS tmp GROUP BY sta_idx [/code]
IT/DB 2010/10/20 08:30

mysql error 2013 Lost connection to MySQL server during query

참고
[code xml]
[mysqld]
# 추가
skip-name-resolve
[/code]


TOTAL 245,655 TODAY 22