단일 테이블에서 실시간 가동률 뽑기

단일 테이블에서 실시간 가동률 뽑기

Database, PHP
일단 하기는 하였는데, 말이 안된다고 생각함! 문제가 뭐냐 하면은 모니터링 데이터를 제가 가공하는것이 아니라, 누군가 가동해 놓은 데이터를 가지고 실시간으로 전달해주는 행단위로 입력된것으로 데이터를 뽑습니다. 위와 같은 화면을 뽑기 위해서 처리해야 될 일은 많지만 이미 내가 만들지 않았고, 있는 정보를 가지고 처리를 해야 합니다. 위와 같은 형식으로 행단위로 엄청나게 쌓이기 시작합니다. 매일 몇초 단위로 데이터가 계속 들어오는 상태입니다. 1개의 Table를 가지고 데이터를 뽑는게 이렇게 힘들것이라고 이번에 처음 느꼈습니다.※ 가능하면 2번 다시 하고 싶지 않음 이제 이름별로 해서 가동률을 한번 뽑아보도록 하겠습니다. MySQL에서 다음의 쿼리문들 사용하였습니다. 위의 화면에 필요한 부분이 아래의 Query 입니다. 보기보다 쉽죠? 만들어 내는대는 하루지만 정리해 놓고 보면은 쉽게 보여집니다. // 이름별 가동율 SELECT A.MACHINE_NAME, CAST(IFNULL(B.MACHINE_PCNT, 0) AS UNSIGNED ) AS MACHINE_PRODUCT_CNT, MIN(C.MACHINE_DATETIME_MIN) AS MACHINE_TIME_MIN, MAX(C.MACHINE_DATETIME_MAX) AS MACHINE_TIME_MAX, CAST(IFNULL(C.USE_TIME, '0') AS UNSIGNED ) AS USE_TIME, CAST(IFNULL(E.USE_TIME_STOP, '0') AS…
Read More

MySQL 트리거를 통해서 프로시저의 동적 쿼리 실행

Database
결론부터 말하면은 대실패 입니다. 의도한대로 전혀 움직이지 않습니다. 그렇기에 MySQL에서는 절대 하지 마십시오. 물론 다른 DBMS인 오라클, MSSQL은 어떤지 아직 직접해보지 않아서 정확히는 모릅니다. 하지만 제가 테스트한 MySQL에서는 전혀 실행이 되지 않습니다. 실패라고 하여도 과정에 대해서 일단 간단히 작성해 놓고 추후에 이런 일이 있으면 교본을 삼으려고 글을 남깁니다. 요구조건1. INSERT 시에 해당 값을 trigger를 통해서 다른 테이블에 기록2. 다른테이블 기록은 '테이블이름_년월' 형식에 기록해서 추후에 관리 용이3. 값이 없는 부분은 가공해서 넣기 어떻게 보면은 정말 간단한 요구사항입니다. trigger의 INSERT시에 캐치해서 월별로 관리하는 Table에 Insert 하는 부분입니다. 물론 이 외에 될수도 있지만 현재로서는 실패 입니다. DROP TRIGGER IF EXISTS `TRIGGER_TEST`; DELIMITER // CREATE TRIGGER `TRIGGER_TEST` AFTER INSERT ON `TRIGGER_TEST_RAW` FOR EACH ROW BEGIN -- 선언 DECLARE Access_Time VARCHAR(20); DECLARE Ip_From VARCHAR(20); DECLARE Status_From VARCHAR(20); DECLARE Work_Rate VARCHAR(10); DECLARE OrgMessageFrom VARCHAR(80); -- 값…
Read More

MySQL 에서 ON DUPLICATE KEY UPDATE 사용시 last_insert_id 값 획득

Database
MySQL에서 Insert, Update를 동시에 할 수 있게 해주는 "ON DUPLICATE KEY UPDATE" 쿼리를 사용할 경우 last_insert_id 결과값을 정상적으로 가져오지 못할 경우가 생기기 마련이다. 이 문제를 해결 하기 위해서는 해당 Table의 컬럼중 "AUTO_INCREMENT" 지정된 컬럼을 가져오면 된다. 쿼리의 예를 들면 다음과 같다. INSERT INTO test(name, age) VALUES ('이름', '19') ON DUPLICATE KEY UPDATE name='이름', age='19', expr=last_insert_id(idx); Insert가 실행되고, last_insert_id()를 획득 할 수 있습니다.
Read More
MySQL DB Schema 관리 프로그램

MySQL DB Schema 관리 프로그램

CSharp, 프로그램
MySQL DB Schema 에 대해서 DBTool을 이용하지 않고 보고 보고서를 Excel로 출력하기 위해서 만들었습니다. 분명히 좋은 프로그램도 많고 하지만 특정 사용인에 맞춰서 출력을 조절하고 DB Schema를 관리 하기 위해서 만들게 되었습니다. 컬럼마다 코멘트와 형식으로 모두 설정이 가능하도록 되어 있어서 여러사람이 이 프로그램을 사용하면은 볼수가 있습니다.
Read More
Local MSSQL 데이터를 MySQL Server로 전송

Local MSSQL 데이터를 MySQL Server로 전송

CSharp, 프로그램
요구사항1. 컴퓨터의 MSSQL 특정 DB table을 MySQL 서버로 전송2. 특정컬럼의 구분자를 구분해서 MySQL로 전송3. 컴퓨터의 MSSQL 데이터를 일정기간 지난후 삭제 하도록 처리4. 프로그램의 실행 시간을 일정시간 간격으로 실행하다록 처리 매번 프로그램을 만들어주는게 간단한것도 있지만 막상 작업을 하다 보면은 손이 많이 가야 하는것이 있습니다. 이번 프로그램도 보기에는 간단한데, 내부적으로 돌아가야 하는 부분은 신경써야 할 곳이 한두곳이 아닙니다. Web API를 만들어서 전송하면은 WebServer에서 담당하면 되지만, 이건 IP가 지정되어서 MySQL 서버가 열러 있어서 해당 프로그램에서 자체적으로 MSSQL, MySQL를 동시에 처리해서 귀찮은 부분이 많았습니다. 일단 일정시간마다 읽어서 모든 Data를 전송하지만, 중복이 되지 않도록 제가 가능한 부분에서 최대한 노력을 하였으며, 현재 한달가 가동현황에서 보면은 문제는 없어 보입니다. 아울러 MSSQL의 데이터를 일정 기간만 유지하도록 Query 문을 사입해서 지우기도 하지 사용하시는분이 이제 편하다는 입장이며 저도 기분이 좋고 사용하시는 분도 좋으니 모든게 잘 풀린 케이스 인듯 합니다.
Read More
Local SQLite의 Table의 내용을 WebServer로 전송

Local SQLite의 Table의 내용을 WebServer로 전송

CSharp, 프로그램
필요사항1. 주기적으로 WebServer로 전송해야함.(단 WebServer에 중복은 방지)2. 각 컴퓨터마다 SQLite 경로가 다르기 때문에 설정이 가능하도록함.3. 각 컴퓨터 구분을 할 수 있도록 함.4. 각 컴퓨터에 일정시간적으로 DB를 읽을수 있도록함.5. 각 컴퓨터 SQLite DB가 Lock이 걸리니 복사해서 사용하도록함. 이상이 5가지 사항을 가지고 만든것이며, 약 일주일 정도 지났지만 문제없이 사용을 하고 있다고 합니다. 생각보다 적은 양의 코딩을 해서 만들었지만 알차게 만든듯 합니다.
Read More

[MySQL] 패스워드 정책 변경

Database
unix_socket 방식을 mysql_native_password 으로 변경하는 방법입니다 SHOW VARIABLES LIKE 'validate_password%'; << 패스워드 정책 SET GLOBAL validate_password_policy=LOW; <- MEDIUM으로 변경도 가능 SELECT password('변경할PASSWORD'); UPDATE user SET plugin='mysql_native_password' WHERE user='root'; ALTER USER 'root'@'localhost' identified with mysql_native_password by '변경할PASSWORD'; ALTER USER 'root'@'localhost' IDENTIFIED with mysql_native_password USING PASSWORD("변경할PASSWORD"); show grants for 'root'@'localhost'; flush privileges; 이렇게 하여도 적용이 안될때가 가끔있는데 서버 재시작을 해주시기 바랍니다. 대부분 변경이 가능하리라 봅니다.
Read More

MySQL, PostgreSQL, SQLite 각 컬럼의 Type차이 기록

Database
인터넷 검색을 통해서 제가 습득한 지식 기반이여서 정확하지 않음을 미리 알려드립니다. MySQL PostgreSQL SQLite TINYINT SMALLINT INTEGER SMALLINT SMALLINT MEDIUMINT INTEGER BIGINT BIGINT BIT BIT INTEGER _______________________________________________________ TINYINT UNSIGNED SMALLINT INTEGER SMALLINT UNSIGNED INTEGER MEDIUMINT UNSIGNED INTEGER INT UNSIGNED BIGINT BIGINT UNSIGNED NUMERIC(20) _______________________________________________________ DOUBLE DOUBLE PRECISION REAL FLOAT REAL REAL DECIMAL DECIMAL REAL NUMERIC NUMERIC REAL _______________________________________________________ BOOLEAN BOOLEAN INTEGER _______________________________________________________ DATE DATE TEXT TIME TIME DATETIME TIMESTAMP _______________________________________________________ TIMESTAMP DEFAULT TIMESTAMP DEFAULT TEXT NOW() NOW() _______________________________________________________ LONGTEXT TEXT TEXT MEDIUMTEXT TEXT TEXT BLOB BYTEA BLOB VARCHAR VARCHAR TEXT CHAR CHAR TEXT _______________________________________________________ columnname INT columnname SERIAL INTEGER PRIMARY AUTO_INCREMENT KEY AUTOINCREMENT
Read More

[MySQL] 상태가 sleep 인것 정리하기

Database
#!/bin/sh NOW=$(date +"%m-%d-%Y") FILE="/root/sleep_processes.$NOW.txt" /var/lib/mysql-5.1.40/bin/mysql -uroot --password='password' -e "select concat('KILL ',id,';') into outfile '/tmp/sleep_processes.txt' from information_schema.processlist where State = 'User sleep'" /var/lib/mysql-5.1.40/bin/mysql -uroot --password='password' -e "source /tmp/sleep_processes.txt;" if [ -s "/tmp/sleep_processes.txt" ]; then cp /tmp/sleep_processes.txt $FILE fi rm -f /tmp/sleep_processes.txt https://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=tipntech&wr_id=81951&page=2
Read More

[MySQL] Auto_Increment 값 재정렬 하기

Database
MySQL에서 데이터를 정리하다 보면 auto_increment 값의 충돌로 데이터가 입력이 되지 않는 경우가 있습니다.이럴 경우 간단히 해결할 수 있는 방법이 있는데요. auto_increment 값을 재지정해주면 쉽게 해결됩니다. 단순히 원하는 값으로 초기화하기를 원하는 경우 ALTER TABLE `table_name` AUTO_INCREMENT=XXXXXX(설정한 인덱스번호); 기존의 ROW들을 재정렬 및 셋팅하기를 원하는 경우 ALTER TABLE `table_name` AUTO_INCREMENT=1; SET @CNT = 0; UPDATE `table_name` SET `table_name`.`auto_colmn` = @CNT:=@CNT+1; 만약에 데이터가 있다면은 작동하지 않을수 있습니다. ALTER TABLE `table_name` DROP `auto_colmn`; ALTER TABLE `table_name` ADD `auto_colmn` INT( {many you want} ) NOT NULL AUTO_INCREMENT FIRST ,ADD PRIMARY KEY (`auto_colmn`); 참조 : https://code.i-harness.com/ko/q/8827ea
Read More

[MySQL] Auto_Increment 한계

Database
[MySQL] Auto_Increment 한계 CREATE TABLE을 할때, TYPE다음에 나오는 괄호안 숫자가 BYTE를 나타낸다고 알고 있었는데요,실제로 데이터를 넣어보니 끝도 없이 들어가네요. 왜 이럴까 문서를 찾아보던중 잘 정리된 블로그가 있어서 원인은 잘 알게 되었지요^^ 참고 : http://blackbull.tistory.com/44 위 사이트를 읽어보면, 결국 괄호안 숫자와 상관없이 MySQL INT 최대값까지 발번이 될것으로 판단되네요.그렇다고 INT 최대값인 4,294,967,295까지 테스트를 해볼수도 없고, 그래서 다시한번 구글링을 해봤습니다. http://forums.devshed.com/mysql-help-4/auto-increment-what-happens-at-max-value-334661.html 요길 보니깐 사람들이 잘 정리해주셨네요^^int(11) auto increment으로 설정을 하게 되면, 최대 4,294,967,295까지 발번이 되고 이후에는 error가 난다고 하네요. 최대값이 얼마나 큰 숫자인지 계산을 한 글도 있는데요,10년동안(3650일) 발번을 한다고 볼때, 일별 1,176,703 rows가 발생해야 최대값을 초과할 수 있습니다. 따라서,Transaction이 엄청 빈번한 OLTP환경에서는 SRL타입을 int(11)로 설정하기보다는unsigned BIGINT로 설정하시는게 좀더 나을것으로 판단됩니다. unsigned BIGINT면 최대값이 18,446,744,073,709,551,615이므로 왠만해서는 최대값을 초과하지 않을것으로 사료됩니다. 물론 그게 아니라면 스키마 설계를 다시하심이 낫지 않을까 개인적으로 생각해봅니다.^^아님, 돈이 빵빵하시면 오라클을 써보심도…
Read More

[PHP] MySQL 데이터 출력

PHP
1. mysql_fetch_row()mysql_fetch_row()는 데이터를 0으로 시작하는 숫자형 인덱스 배열로 반환합니다. $row = mysql_fetch_row($result); echo $row[0]; 2. mysql_fetch_assoc()mysql_fetch_assoc()는 데이터를 문자형 연관 배열로 반환합니다.배열의 키 이름으로는 필드의 이름을 갖습니다. $row = mysql_fetch_assoc($result); echo $row['key']; 3. mysql_fetch_array()mysql_fetch_array()는 $result_type의 값에 따라 반환될 배열의 형태가 다릅니다. $result_type의 값으로는 아래와 같은 상수가 올 수 있으며, 기본값은 MYSQL_BOTH입니다.  - MYSQL_NUM: 이 상수를 사용하면 숫자형 인덱스 배열을 반환합니다.  =  mysql_fetch_row()  - MYSQL_ASSOC: 이 상수를 사용하면 문자형 연관 배열을 반환합니다.  =  mysql_fetch_assoc()  - MYSQL_BOTH: 이 상수를 사용하면 인덱스 배열과 연관 배열을 동시에 반환합니다. ex) $row = mysql_fetch_array($result, MYSQL_BOTH) echo $row['key']; 4. mysql_result()mysql_result($query,0,0);    =>  ' 0행 0열 값 'mysql_result($query,0,1)     =>  ' 0행 1열 값 'mysql_result($query,1,1)     =>  ' 1행 1열 값 ' 5. 주의 사항mysql_fetch_row(), mysql_fetch_assoc(), mysql_fetch_array() 세 함수는 한 행에서 데이터를 읽습니다.또한 데이터를 읽은 후 함수 내부의 포인터를 증가시켜 다시…
Read More

[MySQL]: “Access denied for user ‘debian-sys-maint’@’localhost’”

Database
# # sudo cat /etc/mysql/debian.cnf # 파일 수정 # Automatically generated for Debian scripts. DO NOT TOUCH! [client] host = localhost user = debian-sys-maint password = 비밀번호 socket = /var/run/mysqld/mysqld.sock [mysql_upgrade] user = debian-sys-maint password = 비밀번호 socket = /var/run/mysqld/mysqld.sock basedir = /usr MySQL 로그인 #mysql -u root -p <password> DB 에 비밀번호 적용 mysql> GRANT ALL PRIVILEGES ON *.* TO 'debian-sys-maint'@'localhost' IDENTIFIED BY '비밀번호'; 재시작 #sudo /etc/init.d/mysql restart
Read More