SSIS CSV 파일 날짜 저장 관련 건 관련하여 방법 공유 드립니다.

 

대상을 파일로 저장하기 위해서는 도구 상자에서 플랫 파일 대상을 선택합니다.

 

새로 만들기를 선택합니다.

 

 

연결 관리자 이름과 파일을 저장 시킬 경로를 설정합니다.

 

 

CSV 로 저장하는 것을 확인하기 위해 열 탭에서 열 구분 기호가 쉼표(,)인지 확인합니다.

 

그리고 이제 날짜 포멧으로 저장하기 위하여 해당 연결 관리자 속성에서 Expression 항목을 수정합니다.

 

속성 식 편집기에서 ConnectionString 을 선택한 후 수정합니다.

 

밑의 식 창에서 저장시킬 파일 포멧 식을 작성합니다.

 

"D:\\test\\test__" +(DT_STR,4,1252)DATEPART( "yyyy" , getdate() ) + RIGHT("0" + (DT_STR,4,1252)DATEPART( "mm" , getdate() ), 2) + RIGHT("0" + (DT_STR,4,1252)DATEPART( "dd" , getdate() ), 2) + "_" + RIGHT("0" + (DT_STR,4,1252)DATEPART( "hh" , getdate() ), 2)  + "_" + RIGHT("0" + (DT_STR,4,1252)DATEPART( "mi" , getdate() ), 2)  + "_" + RIGHT("0" + (DT_STR,4,1252)DATEPART( "ss" , getdate() ), 2)   +".csv"

 

그리고 패키지 실행 후 해당 경로의 파일을 확인해보면 파일이 작성한 포멧으로 파일이 저장되어 있는 것을 확인할 수 있습니다.

mysqldump 를 이용하여 전체 백업 복구 후 bin log를 로그 이용하여 나머지 트랜잭션을 복구를 해보자. mysqldump의 자세한 사용 방법은 "[MySQL] mysqldump를 이용한 백업 및 복구" 에서 확인이 가능하다.

mysql> use practice_db;
mysql> select * from test_backup_table;
+------+
| a    |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
|    5 |
+------+

practice_db에 test_backup_table 데이터가 다음과 같다고 하자.

그리고 mysqldump를 이용하여 전체 백업을 받는다. 여기서 중요한 점은 flush_logs 명령을 사용하여 dump를 시작하기전에 bin log를 flush 하자.

shell> mysqldump --single_transaction --databases practice_db --flush_logs -h localhost -u root -p > pratice_db_dump.sql

덤프 후 새로운 데이터를 넣도록 하자.

mysql> insert into test_backup_table(a) values (6),(7);
mysql> select * from test_backup_table;
+------+
| a    |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
|    5 |
|    6 |
|    7 |
+------+

덤프 후 시점에 생성된 bin log가 bin.000004 라고 가정해보자.

복구로 bin log를 사용하기 위해서는 텍스트 형식으로 변환을 해줘야 한다.

shell> mysqlbinlog /var/log/mysql/bin.000004 > binlog4.sql

변환 시 다음과 같은 오류가 난다면 my.cnf 파일에서 'default-character-set=utf8' 를 주석처리 하도록 하자.

mysqlbinlog: unknown variable 'default-character-set=utf8'

my.cnf

[client]
#default-character-set=utf8

이제 복구를 위해서 database가 장애를 통해 사라졌다고 가정하자.

mysql> drop database practice_db;

우선 dump 파일을 이용해 복구를 하고 데이터를 확인한다.

shell> mysql -u root -p < pratice_db_dump.sql
mysql> select * from test_backup_table;
+------+
| a    |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
|    5 |
+------+

그리고 텍스트로 변환한 bin log를 이용하여 복구를 하고 데이터를 확인한다.

shell> mysql -u root -p < binlog4.sql
mysql> select * from test_backup_table;
+------+
| a    |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
|    5 |
|    6 |
|    7 |
+------+


MySQL에서 바이너리 로그는  쿼리 수행을 로그로 남기는 것이다. 이는 로그 백업으로 사용되어 복구로 쓰일 수 있고 Replication 사용 시 동기화에 사용된다.

my.cnf 파일에 다음과 같이 설정을 하면 바이너리 로그를 사용할 수 있다.

파라미터
의미
log-bin바이너리 로그 경로
binlog_cache_size바이너리 로그 캐시 사이즈
max_binlog_size바이너리 로그 최대 사이즈
expire_logs_days보관 기간
[mysqld]
log-bin=/var/log/mysql/bin.log
binlog_cache_size=2M
max_binlog_size=512M
expire_logs_days=7

cnf 파일 수정 후 MySQL 을 재기동하면 바이너리 로그가 생성되는 것을 볼 수 있다.

shell> cd /var/log/mysql
shell> ls -al
..
-rw-rw----. 1 mysql mysql   626  3월 21 17:09 bin.000001
-rw-rw----. 1 mysql mysql 12325  3월 21 17:24 bin.000002
-rw-rw----. 1 mysql mysql 36087  3월 21 17:43 bin.000003
-rw-rw----. 1 mysql mysql 12217  3월 21 17:45 bin.000004
-rw-rw----. 1 mysql mysql   104  3월 21 17:43 bin.index
..


다음 그림과 같이 A 에서 C를 가기위해서는 ssh 를 사용하여 B에 접속하고 B에서 C로 접속해야만 한다고 가정하자.

매번 C에 접속하기 위해서 B에 접속하고 다시 C에 접속하는 것이 번거롭기 때문에 ssh 터널링을 이용하여 A에서 C를 한 번에 접속할 수 있다.

ssh -L사용할포트:목적지IP주소:포트 서버IP주소

ssh -N -L10022:5.6.7.8:22 username@1.2.3.4

다음 명령어로 A에서 10022 포트를 이용하여 B에게 데이터가 전달이 되고 B에서 C에 전달된 데이터를 포워딩해준다라고 생각하면 되겠다.

-N 옵션은 단지 포워딩만 해주는 것이다. 

그 후 실제로 해당 포트를 이용하여 ssh를 통해 접속을 하면 된다.

ssh -p 10022 username@localhost


shell 을 이용하여 외부에서 DB 머신에 접근하여 CSV 파일로 추출 하려면 다음 명령어를 실행하면 된다.


$ mysql -u root -p -h localhost -e "select * from table_name;" | sed 's/\t/","/g;s/^/"/;s/$/"/;' > result.csv


자바스크립트는 기본 타입에 메소드를 추가하여 사용할 수 있다. 


이러한 작업은 함수, 배열, 문자열, 숫자, 정규 표현식, boolean에 모두 가능하다.


Function.prototype.method = function( name, func ){
    if( !this.prototype[name]){
        this.prototype[name] = func;
    }
    return this;
};
 
Number.method('integer'function() {
    return Math[this < 0 ? 'ceil' 'floor'](this);
});
 
console.log((1.333).integer());
console.log((-1.333).integer());



 주요 옵션

옵션
의미
Default
비고
-A, --all-database모든 db dump  
--databases기술한 db 만 dump  
--add-drop-databasecreate database 전에 drop database 실행(error)기존 데이터가 삭제됨
--add-drop-tablecreate table 전에 drop table 실행(tick)--skip-add-drop-table 옵션을 사용하면 drop table 명령 제외
-l, --lock-tablesLock all tables for read(tick)--skip-lock-tables 로 제외가능. 이 옵션보단 --single-transaction 추천
--single-transactionlock 을 걸지 않고 dump 파일의 정합성 보장(error)InnoDB 만 사용 가능
--ignore-table해당 테이블 dump에서 제외(error)다수의 테이블 제외 시 테이블 마다 옵션을 줘야함
--no-create-dbcreate database 구문 제외(error)복구 환경의 database 명이 다를 때 유용
--max_allowed_packet서버와 주고 받을 최대 패킷 사이즈 설정1M첨부파일등이 DB에 있을 시 위 값을 크게 설정
--triggerstigger 도 dump(tick)--skip-triggers 로 제외 가능
--routinesstored procedure, function 도 포함해서 dump(error) 
--flush-logsdump를 시작하기전 flush logs 를 한다. 풀 백업과 증분 백업을 명확히 할 수 있음

 모든 db 및 stored procedure / function 백업

mysqldump --single-transaction --routines --all-databases -h localhost -u root -p > mysqlDump.sql

 db1, db2만 백업

mysqldump --single-transaction --databases db1 db2 -h localhost -u root -p > mysqlDump.sql

 db1에 table1 만 백업

mysqldump --single-transaction db1 test -u root -p > mysqlDump.sql

 db1에 table1, table2 만 제외

mysqldump --single-transaction --databases db1 --ignore-table=db1.table1 --ignore-table=db1.table2 -h localhost -u root -p > mysqlDump.sql

 전체 데이터베이스 복구

mysql -h localhost -u root -p < mysqlDump.sql

 db1 복구

★ 스키마 전체를 백업 후 복구 시 백업파일에 스키마를 삭제 후 복구해야한다.  그렇지 않으면 스키마 전체가 덮어씌어지니 주의

mysql -h localhost -u root -p db1 < mysqlDump.sql

 

Ref : https://www.lesstif.com/pages/viewpage.action?pageId=17105804

character_set은 utf8이지만 mysql 콘솔에 접속하여 데이터 조회 시 ??? 로 나오는 현상이 발생하였다.

+----------+
| name     |
+----------+
| 8952     |
| ????     |
| aviTT    |
| ?????    |
| 20975    |
| ?????    |
+----------+

set names 명령어로 client character set 을 UTF8로 변경 후 조회를 하면 정상적으로 출력이 된다.

mysql> set names 'utf8'
  
+-----------------+
| name            |
+-----------------+
| 8952            |
| トムソン        |
| aviTT           |
| だんしんぐ       |
| 20975           |
| 瑠璃うさぎ       |
+-----------------+


MySQL 설정 파일인 my.cnf 의 위치 확인은 다음과 같은 명령어로 확인이 가능하다.

# mysqld --verbose --help | grep -A 1 'Default options'

또는

 # mysqladmin -help

명령어를 실행하면 my.cnf 경로가 표시된다.

...
Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf
...


 서비스 중지

shell> systemctl stop mysqld

 Data File 복사

shell> cp -r /var/lib/mysql /data/

 해당 디렉토리 권한 설정

shell> chwon -R mysql:mysql /data/mysql

 my.cnf 변경

shell> vi /etc/my.cnf
[mysqld]
#datadir=/var/lib/mysql
datadir=/data/mysql

 selinux 변경

기동 시 [ERROR] InnoDB: os_file_get_status() failed on './ibdata1'. Can't determine file permissions 오류가 난다면 실행

shell> setenforce 0

 서비스 재기동

shell> systemctl start mysqld


'DataBase > MySQL' 카테고리의 다른 글

[MySQL] 조회 시 콘솔에서 일본어 깨짐 현상  (0) 2017.11.22
[MySQL] my.cnf 위치 확인  (0) 2017.11.21
[MySQL] Schema 및 Table 용량 확인  (0) 2017.11.15
[MySQL]my.cnf  (0) 2017.11.14
[MySQL] Character Set, Collation 확인  (0) 2017.11.13

+ Recent posts