mysql] max_allowed_packet 관련 오류

max_allowed_packet에 대한 설명은 다음과 같다.

통신 패킷은 MySQL 서버로 전송되는 단일 SQL 문, 클라이언트로 전송되는 단일 행 또는 마스터 복제본 서버에서 슬레이브로 전송되는 바이너리 로그 이벤트입니다. MySQL 8.0 서버 또는 클라이언트에서 전송할 수 있는 가장 큰 패킷은 1GB입니다.

패킷이라고 나오지만 실제 통신에서 전달되는 크기이다.

이 값은 기본이 16M으로 되어 있으나, 대용량 처리로 인하여 값을 변경해야 할 수 있다. 변경은 my.cnf의 설정에서 다음을 변경하면 된다.(128M로 변경 샘플)

[mysqld]
max_allowed_packet=128M

변경 내역을 반영하려면, 서버를 재기동하거나 다음의 명령어로 재기동 없이 반영 가능하다.

# mysql 설치 위치

> ./bin/mysqladmin -h 127.0.0.1 -u root -p reload

참고 자료


Posted by lahuman

MongoDB] 설치 & 권한 설정

CentOS 7에서 MongoDB를 설치하고 권한을 설정하여 권한이 없는 사용자는 조회/등록/수정/삭제 기능을 사용하지 못하게 한다. MongoDB는 3.6 버젼 기준으로 설명한다.

1. 패키지 매니저에 MongoDB 추가

먼저 /etc/yum.repos.d/mongodb-org-3.6.repo 파일을 생성하고 다음 내역을 추가 한다.

[mongodb-org-3.6]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.6/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.6.asc

2. MongoDB 설치

MongoDB 패키지 설치를 진행 한다.

sudo yum install -y mongodb-org

설치가 완료 되면 mongod 프로세스를 시작한다.

sudo service mongod start

프로세스에 대한 정지 명령어는 다음과 같다.

sudo service mongod stop

만약 MongoDB를 삭제 하려면, mongod 프로세스를 정지 하고 mongodb 패키지를 삭제 한다.

sudo yum erase $(rpm -qa | grep mongodb-org)

설치가 완료 되었으면 설치된 MongoDB로 접속 하여 테스트를 진행 한다.

mongo --host 127.0.0.1:27017

3. MongoDB 사용자 추가

먼저 admin 권한을 설정한다.

use admin
db.createUser(
  {
    user: "myUserAdmin",
    pwd: "abc123",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
  }
)

MongoDB 서비스를 재시작 하고, 접속시 로그인을 해보자

# 접속시 ID/PW 작성
mongo --port 27017 -u "myUserAdmin" -p "abc123" --authenticationDatabase "admin"

# 접속후 Login
mongo --port 27017
use admin
db.auth("myUserAdmin", "abc123" )

# 계정 추가
use test
db.createUser(
  {
    user: "myTester",
    pwd: "xyz123",
    roles: [ { role: "readWrite", db: "test" },
             { role: "read", db: "reporting" } ]
  }
)

하지만 아직까지는 Login을 하지 않아도 조회/등록등의 기능이 가능하다.

4. MongoDB 권한 설정

/etc/mongod.conf 설정 파일에서 다음 항목을 수정한다.

security:
    authorization: "enabled"

MongoDB 서비스를 재기동 하고 접속 테스트를 한다.

sudo service mongod restart

로그인 이후에 데이터 조회나 등록을 하려고 하면 권한이 없다는 메시지가 표출 된다.

mongo --port 27017

> db.test.insert( {x:1, y:1} )
WriteResult({
	"writeError" : {
		"code" : 13,
		"errmsg" : "not authorized on test to execute command { insert: \"test\", ordered: true, $db: \"test\" }"
	}
})
> db.test.find( {} )
Error: error: {
	"ok" : 0,
	"errmsg" : "not authorized on test to execute command { find: \"test\", filter: {}, $db: \"test\" }",
	"code" : 13,
	"codeName" : "Unauthorized"
}
# 로그인 진행
> db.auth('myTester', 'xyz123')
1
> db.test.find( {} )
{ "_id" : ObjectId("5b0b8c26efefcbe94ba75c29"), "x" : 1, "y" : 1 }
> db.test.insert( {x:1, y:1} )
WriteResult({ "nInserted" : 1 })
> db.test.find( {} )
{ "_id" : ObjectId("5b0b8c26efefcbe94ba75c29"), "x" : 1, "y" : 1 }
{ "_id" : ObjectId("5b0b8d6753b23794e42015e9"), "x" : 1, "y" : 1 }

참고 자료


Posted by lahuman

MyISMA VS InnoDB

1. MyISMA

MyISMA 의 특징은 non-transactional-safe(트랜잭션 기능 제공 안 함)와 데이터 모델 디자인이 단순하다는 것이다.

장점

  • 단순한 디자인으로 인해 따라서 Select 작업 속도가 빠르고 많은 읽기 작업에 적합하다.
  • Full-text 인덱싱이 가능하여 검색하고 하는 내용에 대한 복합 검색도 가능하다.
  • 테이블 단위로 물리 파일이 존재하여 백업 & 복구가 쉽다.
    1. .frm - 테이블 정의 파일
    2. .MYD - 테이블 데이터 파일
    3. .MYI - 테이블 인덱스 파일

단점

  • Table-Level Lock 사용으로 쓰기 작업이 느리고 다음과 같은 문제가 있다.
    1. SELECT (진행 중), Update(대기 중) 일 경우에 해당 테이블에 대한 SELECT 작업도 함께 LOCK이 걸린다.
  • 데이터 무결성이 보장되지 않는다.
  • 트랜젝션 기능 제공 안 한다.

2. InnoDB

InnoDB는 트랜잭션 기능을 제공하고 Row-level locking, 외래 키 지원, 장애 복구 등의 다양한 기능을 지원한다.

장점

  • Row-level Lock 사용으로 변경 작업이 빠르고 해당 ROW를 제외한 동시 처리가 가능하다.
  • 데이터 무결성 보장한다.
  • 제약조건, 외래 키 생성, 동시성 제어 등 가능하다.

단점

  • Full-text 인덱싱 불가능하다.
  • MyISAM에 비해 시스템 자원을 많이 사용한다.

참조


Posted by lahuman

문자열을 rows로 변환하는 질문이 있어서 해당 건에 대한 처리 내역 입니다.

조건 

다음과 같은 Table가 있을 경우 


id 

name 

1

사과 

배 

사과,포도 


다음과 같은 결과를 도출하기를 원한다.


name

count 

배 

1

사과 

포도 


해당 건을 처리 하기 위해서는 사과,포도 라는 문자열을 2개의 ROW 처럼 인식 하도록 수정 해야 한다.


처리 결과 : http://sqlfiddle.com/#!2/04a0f/2


내역 설명 

-- 테이블 & 데이터 설정
CREATE TABLE tablename (
  id INT,
  name VARCHAR(20));

INSERT INTO tablename VALUES
(1, '사과'),
(2, '배'), 
(3, '사과,포도');

-- 최대 6개까지 처리 가능 만약 더 필요 하다면 데이터 값을 추가 해야함
CREATE TABLE numbers (
  n INT PRIMARY KEY);

INSERT INTO numbers VALUES (1),(2),(3),(4),(5),(6);

-- number와 join 하여 , 기준의 문자를 여러 row 처럼 인식하도록 처리
select a.name, count(1) from (
SELECT
  tablename.id,
  SUBSTRING_INDEX(SUBSTRING_INDEX(tablename.name, ',', numbers.n), ',', -1) name
FROM
  numbers INNER JOIN tablename
  ON CHAR_LENGTH(tablename.name)
     -CHAR_LENGTH(REPLACE(tablename.name, ',', ''))>=numbers.n-1
  ) a group by a.name


사실 참고 SQL을 가지고 살짝만 수정한 것이다.


질문 원본 : https://www.facebook.com/groups/codingeverybody/1025201834187019/?notif_t=group_comment_reply


참조 내역 : http://stackoverflow.com/questions/17942508/sql-split-values-to-multiple-rows

Posted by lahuman

mysql 에서는 ROWNUM 이라는 것이 존재 하지 않는다.


하지만 다음과 같이 사용 할수 있다.



SELECT @RNUM := @RNUM + 1 AS ROWNUM, t.*

FROM

  (

    SELECT *

    FROM table

    ORDER BY column1

  ) t,

  ( SELECT @RNUM := 0 ) R



출처 : http://dhplanner.blogspot.kr/2009/07/mysql-rownum-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0.html

Posted by lahuman

검색을 하다 보면 특정 컬럼에서 숫자로된 데이터만 조회해야 할 경우가 있다.


그럴 경우 간단하게 정규식을 이용해서 처리 할수가 있다.


--숫자로된 내용만 찾는다.
WHERE myField REGEXP '^[0-9]+$'
WHERE myField REGEXP '^[[:digit:]]+$'
WHERE myField NOT REGEXP '[^0-9]'



정규식을 이용할 경우 성능에 문제가 있으니, 최소한의 ROW를 뽑은 이후 사용하는 것이 좋다.

Posted by lahuman
UPDATE tablename SET columnname=1

위와 같은 질의를 요청 하였을때 (Where 조건 없이 column을 update 시)


You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column To disable safe mode, toggle the option ....


과 같은 오류를 만났다면, 


safe-updates option을 확인하여야 한다..


위의 옵션이 1일 경우, update 또는 delete를 where조건  key(ex. prmary key) 없이 할 수 없다.


아니면 SQL을 where 조건을 사용하여, 처리 하여야 한다.


옵션을 변경하는 방법은

SET SQL_SAFE_UPDATES = 0;

이다.


참고 : http://stackoverflow.com/questions/11448068/mysql-error-code-1175-during-update-in-mysql-workbench

Posted by lahuman

cvs 파일을 mysql에 Import 하는 방법이다.

프로그램을 설치 하지 않고 mysql에 접속하여 간단하게 실행 할 수 있다!


명령어 : 

LOAD DATA LOCAL INFILE 'C:/Temp/temperout.csv' INTO TABLE grahn.temp FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';



참조 URL : http://stackoverflow.com/questions/11429827/how-to-import-a-csv-file-into-mysql-workbench

Posted by lahuman