리눅스 머신에서 파일시스템을 생성하려 할 경우 다음과 같이 "Permission denied" 에러나 날 경우가 있다

# mkfs -t ext4 /dev/sda1

mkfs.ext4: Permission denied


다른 패키지의 리눅스에서는 잘 쓰던 명령어였는데 원인을 찾을 수 없어서 고민하던 중 /sbin아래서 mke2fs라는 명령어가 존재함을 찾아내서 실행해 보니

# mke2fs -t ext4 /dev/sda1

mke2fs 1.42.11 (09-Jul-2014)

Creating filesystem with 488378368 4k blocks and 122101760 inodes

Filesystem UUID: db8b2a2a-b725-40f8-b956-13fc7ae3f5f1

Superblock backups stored on blocks:

        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,

        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,

        102400000, 214990848


Allocating group tables: done

Writing inode tables: done

Creating journal (32768 blocks): done

Writing superblocks and filesystem accounting information:

done


아직 정확한 원인을 모르겠으나 지금 짐작하기로는 패키지별로 다른 무언가가 있지 않을까 생각된다.



Posted by Mr.Jo :

우선 시스템 상태, 측 CPU 사용률, IO등을 웹으로 자동화 하여 모니터링 하기 위해서는

iostat, vmstat, /proc/stat 등 유틸을 이용하면 되지만

이를 웹페이지 등으로 만들어 외부에서 모니터링 하기 위해서는 텍스트에서 특정 수치만을 갖고 와야 하는 경우가 생긴다.


cpu사용률을 구하기 위한 예를 작성해 보면


iostat의 -c옵션으로 가져 올 수 있는데

# iostat -c

Linux 3.13.0-24-generic (test)         09/01/2014      _x86_64_        (1 CPU)


avg-cpu:  %user   %nice %system %iowait  %steal   %idle

           0.59   90.03    9.19    0.00    0.00    0.19


위 값에서 숫자만을 분리해 내야 한다

tail 명령어를 사용하면 특정 줄을 가져 올 수 있으니 사용하면

# iostat -c | tail -2

           0.59   90.03    9.19    0.00    0.00    0.19


여기서 1번째 0.59만을 가져오기 위해 awk를 사용하자

# iostat -c | tail -2 | awk '{print $1}'

0.59


이런 식으로 쉘에 변수 할당 혹은 프로그램에서 외부 실행 후 변수에 값 할당으로 원하는 결과를 얻을 수 있을 것이다.


Posted by Mr.Jo :

db2 ver 9 이후부터는 lobs 혹은 lobfile을 지정 할 경우 자동으로 lobsinfile 옵션이 자동으로 활성화 되지만


db2 ver 8 이전에는 lobsinfile을 지정하지 않을 경우 lobs 및 lobfile 옵션이 적용되지 않아서 약 32KB 의 데이터만 받아짐



Posted by Mr.Jo :

보통 멀티코어 시스템을 갖고 있을텐데

그냥 make 명령으로 컴파일 할 경우 작업을 한번에 한개만 사용하게 된다

make -j4

처럼 j뒤 숫자를 코어수에 맞게 적당히 할당하면 컴파일 속도를 올릴 수 있다


Usage: make [options] [target] ...

Options:

  -j [N], --jobs[=N]          Allow N jobs at once; infinite jobs with no arg.

....

Posted by Mr.Jo :

Mysql과 MariaDB에 핫백업(Online Backup)을 지원하는 툴 중 무료에 쓸만한 툴은 Percona의 Xtrabackup이 제일 유명할 것이다.

하지만 한글로 정리된 자료 중 예와 함께 정리된 자료를 찾기 힘들어 이렇게 정리한다.




1) 백업 수행 계정

우선 백업하는 OS 계정은 root 혹은 mysql로 하는 것이 정신 건강상 편하다(보안을 위해 가능한 mysql계정으로)

설치 방법에 따라 다르지만 ubuntu에서 apt-get으로 설치했다고 하면 아마도 다음과 같이 소유권이 생성되어 있을 것이다.



여기서 소유권이 모두 접근 가능해야 하기 때문에 권한 설정을 잘 해 놓아야 하기 때문에 다른계정은 설정이 쉽지 않다.

(dba그룹을 만들고 참여하게 한다든지 방법이 없지는 않다.)




2) 모든 DB 백업

ex)

innobackupex  <백업경로>



위와 같이 하면 백업경로 아래에 시간 폴더가 생성되며 백업이 저장된다

(os계정 로그인에 관리자 권한이 없다면 "--user <관리자계정> --password <암호>"를 추가하자)




3) 로그 백업 (로그를 기존 백업에 수정된 내용이 반영됨)


ex)

innobackupex --apply-log <백업경로>/<시각폴더>




4) 모든 DB 복원


데이터 폴더 이름을 바꿔놓고(만약을 위해) 새로 생성후(빈 폴더) 권한을 바꿔주는 것이 포인트!

ex)

service mysql stop
mv /var/lib/mysql /var/lib/mysql_old
mkdir /var/lib/mysql
chown mysql:mysql /var/lib/mysql
innobackupex --copy-back <백업경로>
chown -R mysql:mysql /var/lib/mysql
service mysql start




5) 특정 DB복원


Database파일이 손상되었다면 그대로, Drop 하였다면 같은 이름으로 생성한(show databases에서 보이도록) 상태에서


ex)

service mysql stop
mv /var/lib/mysql/<대상디비명> /var/lib/mysql/<대상디비명>_old
cp -r <백업경로>/<대상디비명> /var/lib/mysql/<대상디비명>
chown -R mysql:mysql /var/lib/mysql/<대상디비명>
service mysql start

아마 여기까지 했다면 Database에 접속은 되지만 Table Select가 안될 것이다

찾아보면 서버에서 갖고 있는 테이블 정보와 매칭이 안되서라고 하니 다음을 수행시키자


확인해 보면 아마 복원 되어 있을 것이다




6) 특정 Table 복원


맹락은 특정 Database복원과 같다

show tables로 보이도록 만들어 두고


ex)

service mysql stop
mv /var/lib/mysql/<대상디비명>/<대상테이블명> /var/lib/mysql/<대상디비명>/<대상테이블명>_old
cp -r <백업경로>/<대상디비명>/<대상테이블명> /var/lib/mysql/<대상디비명>/<대상테이블명>
chown -R mysql:mysql /var/lib/mysql/<대상디비명>/<대상테이블명>
service mysql start


아마 여기까지 했다면 Database에 접속은 되지만 Table Select가 안될 것이다



mysqlcheck --all-databases


확인해 보면 아마 복원 되어 있을 것이다



'프로그래밍 > Mysql\정보' 카테고리의 다른 글

[MySQL] Stored Procedure 와 Compile  (1) 2014.10.23
[MySQL] Replication (복제) 동기화 문제  (0) 2014.10.23
Posted by Mr.Jo :


작동버젼 : v10.0
사용방법 : 쉘에서 실행
주의사항 : 스키마 확인 필요
설      명 : 테이블 조작 등으로 팬딩된 재구성이 필요한 테이블 찾기



db2 "SELECT TABNAME FROM SYSCAT.TABLES WHERE STATUS='C'"
or
db2 "SELECT 'DB2 SET INTEGRITY FOR ' || TABNAME || ' ALL IMMEDIATE UNCHECKED' FROM SYSCAT.TABLES WHERE STATUS='C'"



Posted by Mr.Jo :

출처 : http://www-01.ibm.com/support/docview.wss?uid=swg1IZ26799


요약하면 db2diag.log에 메모리 부족 에러 뜨면서 복원이 안될텐데

해결방법은 같은 이름의 디비를 원하는 경로에 생성

DBHEAP, LOGBUFSZ 값을 동일하게 셋팅 후

RESTORE옵션에서 REPLACE EXISTING 을 붙여서 치환하면

문제 해결됨



사용된 스크립트

#같은 이름의 DB생성(대상서버)

db2 create database


#설정값 확인(원본서버)

db2 get db cfg for sample | grep DBHEAP

db2 get db cfg for sample | grep LOGBUFSZ


#설정값 대입(대상서버)

db2 update db cfg using DBHEAP <원본값>

db2 update db cfg using LOGBUFSZ <원본값>


#복원(대상서버)

db2 restore database <db명> FROM <절대경로> REPLACE EXISTING

Posted by Mr.Jo :

디비 서버를 운영하다 보면 다음과 같은 경고 메시지를 가끔 보곤 한다

다른거야 그렇다 치고 TrustedInstaller.exe 요녀석이 평소에는 별 문제가 없는데 가끔 메모리와 CPU를 마구 먹는다


서비스에서 다음 서비스를 중지 시키면 되는데 중지 시키기 전에 시스템 관리자에게 먼져 꼭 물어보길...

뒷일은 책임 안진다.

Posted by Mr.Jo :

프로세서나 코어가 2개 이상 있고 대량 처리 작업중에서 실행계획에 ParallelSort가 있는 경우

순서가 보장되지 않는다.

MSSQL 20052008, 2008R2에서 확인했던 내용인데 2012는 아직 확인해 보지 못했다


아마도 CPU에 일을 분할 할 때 문제가 발생하는 것 같은데 버젼이 바뀌어도 계속 발견되고

운에 따라 발생 안할 경우도 있고 해서 상당히 신경 쓰이는 문제다


해결 방법은 간단하게 MAXDOP 1 을 옵션으로 줘서 병렬처리를 막으면 정상 적으로 결과가 나온다.

Posted by Mr.Jo :

MSSQL2005 부터 생긴 Cross Apply 조인


아직 많은 테스트가 필요하지만 적당한 Index가 있을 경우 처리할 데이터를 상당히 줄여줘 성능 향상에 도움이 된다

(다른 경우도 마찬가지지만 더욱 큰 폭으로)

특히 해당 유저의 최근 기록 같은 류의 정보를 추출할 때 기존 방식의 경우 이를 다시  Self Join 하거나 

문자열 조작으로 처리하곤 했는데 

Self Join 의 경우 테이블을 두번 읽게 되고 문자열 조작의 경우 그 구문이 상당히 길어질 뿐더러 복잡해서 쉽게 사용 하기 힘들다

더군다나 SQL의 경우 (C, C++, C#, Java, 등등의)프로그램 랭귀지들 보다 문자열 처리에 느린 편이다


하지만 Cross Apply의 경우 비교적 간단한 구문으로 빠르고 유용하게 사용 할 수 있다

이는 유지보수도 쉬워서 내가 아닌 다른 사람이 주석 없이도 내용 파악이 쉽고 그만큼 실수를 할 가능성도 줄어듬을 의미한다.


조심할 점은 Nested Loop Join으로 풀어 나가니 대용량 처리에는 부적합 하고 이런 저런 테스트를 꼭 해봐야 한다는 것!


--기존방식
SELECT a.UID, b.RegDate
FROM dbo.[User] AS a WITH(NOLOCK)
INNER JOIN
(
	SELECT a.UID, MAX(a.RegDate) AS RegDate
	FROM dbo.[UserLoginLog] AS a WITH(NOLOCK)
	GROUP BY a.UID
) AS b ON a.UID = b.UID


--Cross Apply
SELECT a.UID, b.RegDate
FROM dbo.[User] AS a WITH(NOLOCK)
CROSS APPLY
(
	SELECT TOP 1 b.UID, b.RegDate
	FROM dbo.[UserLoginLog] AS b WITH(NOLOCK)
	WHERE a.UID = b.UID
	ORDER BY RegDate DESC
) AS b
위의 실행 결과 비교는 다음과 같다


테스트용 데이터 이기 때문에 데이터 량이 적지만 실제 서버의 엄청난 데이터를 생각한다면 그 차이는 더더욱 클 것이라 생각된다.



ps1. Apply 구문에는 Cross Apply와 Outer Apply가 존재 하며
       이 차이는 Inner Join과 Left Outer Join혹은 Right Outer Join과 동일함

ps2. 테스트 데이터는 다음과 같이 만들었음
CREATE DATABASE TEST;
GO

USE TEST;
GO

CREATE TABLE dbo.[User]
(
	 UID int
	,Name varchar(10)

	,CONSTRAINT PK_User_UID PRIMARY KEY(UID)
);


CREATE TABLE dbo.[UserLoginLog]
(
	 UID int
	,RegDate datetime

	,CONSTRAINT FK_UserLoginLog_User_UID FOREIGN KEY(UID) REFERENCES dbo.[User](UID)
);

CREATE UNIQUE CLUSTERED INDEX UIDX_UserLoginLog_UID_RegDate ON dbo.[UserLoginLog](UID, RegDate);
GO

INSERT INTO dbo.[User](UID, Name) VALUES(1, '가나다');
INSERT INTO dbo.[User](UID, Name) VALUES(2, '라마바');
INSERT INTO dbo.[User](UID, Name) VALUES(3, '사아자');
INSERT INTO dbo.[User](UID, Name) VALUES(4, '차카타');
GO


INSERT INTO dbo.[UserLoginLog](UID, RegDate)
SELECT ROW_NUMBER() OVER(ORDER BY a.OBJECT_ID) % 4 + 1 AS UID, DATEADD(SS,  ROW_NUMBER() OVER(ORDER BY a.OBJECT_ID), GETDATE()) AS RegDate
FROM sys.objects AS a
	CROSS JOIN sys.objects AS b;
GO



Posted by Mr.Jo :