2021. 11. 1. 10:53

대용량 로그를 SQL Developer 또는 프로그램에서 넣으니까...

 

아카이브에 백업 로그가 엄청 쌓여서 풀찬다.

 

그래서, 찾아보니, sql로더를 사용해서 넣으라고 하더라...

 

먼저 sqlldr 이 설치 되어 있는지 확인해 보고, 없으면 설치해야한다.

 

cmd 명령 프롬프트에서 sqlldr을 실행해보고, 찾을수 없으라고 뜨면, 설치부터 진행

 

 

구조를 설명하면, ctl 파일(콘트롤파일)에 입력값에대한 정보를 작성해야한다.

 

그리고, sqlldr 를 실행하면 된다.

 

C\user> sqlldr 디비접속정보 CONTROL= ctl파일명 LOG = 로그파일명

 

하지만, 저렇게 하면, 매번 써야되는 불편함이 있어서, 

 

bat 파일을 생성해서 위 실행문을 미리 적어 놓고, bat 파일을 실행했다.

 

 

먼저 ctl 파일부터 설명하면, 

LOAD DATA
CHARACTERSET  UTF8
INFILE 'log_202004.txt' 
BADFILE 'log_202004.bad'
DISCARDFILE 'log_202004.dsc'
APPEND
INTO TABLE "DB_USER_NAME"."TABLE_NAME"
FIELDS TERMINATED BY X'9'
(FIELD1_NM,
FIELD2_NM,
FIELD3_NM char(4000),
FIELD4_NM char(4000),
FIELD5_NM char(4000),
FIELD6_NM)

CHARACTERSET 은 한글이 있으므로, UTF8로 적어준다.

 

INFILE 은 넣을 DATA의 TXT 파일이다.

BADFILE은 입력이 들어가지 않은 라인의 정보 모음이다.

BADFILE 이 생성되면, 들어가지 않은 데이터가 생겼으므로, BAD 파일의 로그만 따로 정리해서 다시 실행하면 된다.

(이게 생각보다 편하다... 전체 지우고 다시 넣는게 아니라...값이 잘못된서 못 들어간 정보만 확인해서 다시 넣을 수 있으므로..)

 

그리고, INTO TABLE 에 처음에 DB 유저명을 적고,  점 뒤에 넣을 테이블 명을 적으면 된다.

밑에 ( 괄호부터는 필드 명을 적어주는데, char(4000)적은거는, 따로 적어주지 않으면, 기본 default로 255자로 잡혀서 그 이상은 오류가 발생한다.

에러 "Field in data file exceeds maximum length" 가 생길때, 처리하기 위해서

char(4000) 최대값을 적어준거다. char 안적은거는 255로 잡힌다.

 

 

자 이제 ctl 파일은 준비가 되었다.

여러개를 입력해야하니, 그때마다 명령어를 쓰기 힘드니, 

에디터를 열고, bat 파일을 만들어 준다.(예, test.bat)

 

sqlldr 디비접속정보 CONTROL= ctl파일명 LOG = 로그파일명

sqlldr db_user/db_password@db_ip CONTROL = log_info.ctl LOG= importlog.log

@뒤에 db_ip에는 tns에 세팅이 되어있으면, tns명을 넣어줘도 된다.

 

 

저장하고, 명령 프롬프트에서 bat를 실행하면 된다.

 

로더를 사용하면, 생각보다 속도도 빠르고, 잘못된 필드값 정리도 되서, 오히려 작업하는데 유용하다.

처음 세팅이 복잡해서 그렇지, 한번하면, 그 이후에는 빠르게 작업할 있다.

 

실행하면, 아래처럼 레코드 수가 뜨고, 작업양을 볼수 있다.

SQL*Loader: Release 11.1.0.6.0 - Production on 수 9월 15 20:23:47 2021

Copyright (c) 1982, 2007, Oracle.  All rights reserved.

커밋 시점에 도달 - 논리 레코드 개수 18
커밋 시점에 도달 - 논리 레코드 개수 36
커밋 시점에 도달 - 논리 레코드 개수 54
커밋 시점에 도달 - 논리 레코드 개수 72
커밋 시점에 도달 - 논리 레코드 개수 90
커밋 시점에 도달 - 논리 레코드 개수 108
커밋 시점에 도달 - 논리 레코드 개수 126
커밋 시점에 도달 - 논리 레코드 개수 144
커밋 시점에 도달 - 논리 레코드 개수 162
커밋 시점에 도달 - 논리 레코드 개수 180

 

Posted by Tyson
2021. 8. 24. 22:01

서버에서 라라벨 소스 가져와서, 로컬에서 작업하는데,

 

로그인 후에...계속,  토큰이랑, 세션 정보가 쿠키에 저장이 안되서....

 

이것저것 다해보다가...결국 보니까..

 

.env 파일에,

SESSION_DOMAIN 을 로컬호스트로 바꿔줬어야 한다.

아마 로그인할때 생성하는 토큰이 도메인을 확인하는거였나 보다....

 

기존에  아래 두개에 써있던 도메인을 지우고, 로컬호스트 ip로 적어주니까, 로그인이 된다.

SESSION_DOMAIN=127.0.0.1

SANCTUM_STATEFUL_DOMAINS=127.0.0.1

 

'컴퓨터 > Laravel(라라벨)' 카테고리의 다른 글

composer install 토큰 에러 (could not fetch [repository])  (0) 2023.07.25
라라벨 419 에러  (0) 2021.08.24
라라벨 캐쉬 지우기  (0) 2021.08.24
Posted by Tyson
2021. 8. 24. 18:34

인터넷에 맥에 오라클 12.2에 대한 설명은 많은데, 그 이상은 잘 없다.

오라글 버전별 지원 OS

12.2 :  High Sierra, Sierra and El Capitan

18.1 : Mojave and High Sierra

19.8 : High Sierra, Mojave, Catalina, Big Sur

까지 지원이다.

난 19.8를 설치해야 한다.ㅠㅠ

 

 

먼저 아래 링크로 들어가서, 19.8를 다운 받는다.

https://www.oracle.com/database/technologies/instant-client/macos-intel-x86-downloads.html

 

 

여기보면, zip, dmg 있는데, dmg도 결국은 파일들 있는거고, 그거를 download 폴더에 압축을 풀어주는것만 한다...

 

그냥 zip파일로 받고 클릭해서 압축을 푼다.

 

 

그리고, oci8를 위해서는 sdk도 받아야한다.

 

 

sdk에 다 포함되어 있는게, 아니고, 

 

추가적인 파일만 있으므로, 

 

둘 다 받아서 클릭하면, 

 

instantclient_19_8

이라는 폴더가 생성이 되고,

sdk 는 sdk란 폴더가 생성이 된다.

 

 

 

둘다 클릭하면, 다른 이름으로 두개 폴더가 생기는데, 

"instantclient_19_8 2" 폴더에 있는거를 

"instantclient_19_8" 폴더로 다 옮겨준다.

 

베이직은 

 

이런 파일들이 있고,

sdk  는 이런 파일들이 있는데, 

sdk 폴더를 instantclien_19폴더에  아래처럼 복사해 준다.

이렇게 하는 이유는 저 폴더를 전체 다 이동시킬거다.

 

 

 

 

 

그리고,  oci8를 아래 에서 다운 받는다.

http://pecl.php.net/package/oci8

 

php 버전이 7.0인경우, 

2.2.0 으로 다운 받아야 된다. 

 

처음에 3.0으로 받았다가.... 지원이 안되서 다시 작업했다.

 

tgz 파일로 다운받고, 압축 풀면 아래처럼 파일이 있는데,

xml파일은 상관없고, oci8-2.2.0 폴더도 그냥 "instantclient_19_8"폴더에 넣어준다.

 

자, 이제 부터 시작이다. 

/usr/local/밑에 폴더를 생성해야한다.

우리는 

/usr/local/oracle/instantclient_19_8로 하겠다.

 

먼저 터미널을 열고, 

>cd /usr/local

로 이동한다음. 

> open . 

를 치면, 이 폴더가 파인더에서 열린다.

(파인더에서 바로 가는 방법도 있는데, 좀 복잡하므로, 이 방법으로 한다.)

 

local 폴더 안에 oracle 폴더를 만들어 주고, 

그 안에, 아까 합쳐 놓은 instantclient_19_8 를 넣어준다.

 

그리고, 

다시 터미널에서 

그리고, 심볼릭 링크를 만들어줘서, 다른데서도 /usr/local/oracle/instantclient_19_8 로  접속해서 사용할 수 있게 해야한다.

 

> sudo ln -s /usr/local/oracle/instantclient_19_8/*.dylib /usr/local/lib/

*.dylib 파일들 전부를 /usr/local/lib에 바로가기를 만들어준거다.

 

 

< PHP OCI8 설치하기>

아까 넣어놓은 oci폴더로 이동한다.

> cd /usr/local/oracle/instantclient_19_8/oci8-2.2.0

 

phpize 를 실행해야하므로, autoconf를 설치한다.

>brew install autoconf

>sudo phpize

 

configure 팡리이 생성이 되면,

$> ./configure --with-oci8=instantclient,/usr/local/oracle/instantclient_19_8
$> make
$> make install

 

configure 는 설정(폴더위치등을 설정)

make 컴파일

make install 은 컴파일된거를 설치이다.

 

그리고, php.ini 에 extension=oci8.so 를  추가해줘야한다.

php.ini 위치는 터미널에서

>  php --ini 

를  치면, 아래처럼 나온다. 

Configuration File (php.ini) Path: /usr/local/etc/php/7.4
Loaded Configuration File:         /usr/local/etc/php/7.4/php.ini
Scan for additional .ini files in: /usr/local/etc/php/7.4/conf.d

 

나는 /usr/local/etc/php/7.4/php.ini 에 있으므로,

> vi /usr/local/etc/php/7.4/php.ini 로 에디터로 들어간다음에,

 

extension=oci8.so

를 써주고, 저장하고 나온다.

 

 

그리고, 아파치 재실행

 

접속확인은 

> php -r "oci_connect();"

치면 된다.

 

설치가 안됬으면, 에러가 뜨고, 연동 되었으면, 다른게 뜬다.

(warning)은 대체적으로 괜찮다.

 

 

 


참고 URL: https://blog.edit.kr/entry/High-Sierra에-PHP-Oracle-oci8-연결하기 [소금인형 - SW개발자?]

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=spring1a&logNo=221600292690 

 

Posted by Tyson
2021. 8. 24. 17:03

네이버 클라우드 서비스들을 다 삭제했는데..

 

계속 비용이 나가길래.... 

 

마이페이지  -> 이용관리 -> (탭) 서비스 이용 현황

으로 들어가니, 아래처럼 3개 서비스 사용중이란다.

NAT Gateway

Object Storage

Certificate Manager

 

이렇게 이용중이란다.

그래서 콘솔로 가서 보면, 아래처럼서비스 중인게 없다. 분명히 다 삭제했었는데..

 

도대체 근데, 왜 돈이 나가고  있다 해서 고객센터문의해보니,

 

Object Storage의 Subscription 서비스가 이용중이였던거다.

 

 

각 서비스들의 Subscription 서비스로 들어가서 애들을 다 중지해줘야 한다.

 

진짜.... 그러면, 내 목록에  Subscription이라고 해주던지...

 

이 서비스들 비용만벌써 몇주동안 나가고 있었던거다..ㅠㅠ

 

Object Storage의 Subscription 과

Certificate Manager의  Subscription 들어가서해지해준다.

 

그리고, NAT Gateway 는 좀 복잡한데...

VPC 플랫폼에서 생성한것이라, 

클래식을 VPC로 바꿔주고

 [Console > Plaform에서 VPC 선택 > VPC > NAT Gateway]에서 해당 NAT Gateway 삭제 해야한다.

 

  - 바로 가기 : https://console.ncloud.com/vpc-network/natgw

참...서비스 중지하기도 힘들다....ㅠㅠ

 

 

Posted by Tyson
2021. 8. 24. 16:05

로컬에서 서버띄어서 테스트 중인데, 

419 에러가 뜨길래 보니, 

 

"CSRF token mismatch."

라는데...

 

작업하는동안에는 csrf 꺼놓고 싶어서, 끄는방법은.

 

라라벨 프로젝트 폴더

/app/Http/Middleware/VerifyCsrfToken.php 파일에 보면,

아래처럼, $except 부분이 있다.

그곳에 

제외하고 싶은 url 적으면 된다.

 

class VerifyCsrfToken extends Middleware
{
    /**
     * The URIs that should be excluded from CSRF verification.
     *
     * @var array
     */
    protected $except = [
        'stripe/*',
        'http://127.0.0.1:8000/login'
        //
    ];
}

여러개 쓸때는 , (콤마) 잊지 않도록...ㅠㅠ

 

그외 자바스크립트에 @csrf 로 예외시키는 방법도 있다.

 

 

참고 url 

https://laravel.kr/docs/8.x/csrf

 

Posted by Tyson
2021. 8. 24. 13:59

라라벨 소스를 서버에서 복사에서 쓰는데.... 

 

php artisan serve로 시작하는데, 서버가 뜨기는 하는데, 

 

"There is no existing directory at "/www(경로)" and it could not be created: Read-only file system." 

에러가 뜨더라...

 

root 디렉토리가, 서버랑 똑같이 잡혀서 권한이 없어서.... 로그파일을 쓰지를 못하는거다...

 

로컬에서 서버를 띄웠으면, 거기를 루트로 잡아야하는데...

 

더 확인해 보니, 

/bootstrap/cache/config.php 파일에, 경로가 서버 경로가 들어가 있는거다.

 

캐쉬파일인데...일일히 경로는 다시 바꿔줘야하나.....

 

서버 시작할때 분명히 다시 잡아줬을거라 생각했는데......

 

그게 아니고, 라라벨 캐쉬를 지우고, 다시 시작해 주면 되다.

 

>  php artisan cache:clear

로 캐쉬를 지워주고,

 

> php artisan serve 

로 다시 시작해 주면 된다.

Posted by Tyson
2021. 8. 23. 18:21

데이터 text 길이가 너무 길어서,  

표에서 ... (점점점)  으로 보이게 하고, 데이터 값을 툴팁으로 띄어주고 싶어서

툴팁으로 만들었다.

텍스트 생략 방법은 아래 참고

https://tyson.tistory.com/45?category=859198 

 

긴문자열 생략표시(....)으로

긴문자생략 td 스타일에 저거 넣어주면, 알아서 생략됨. 뒤에는 .....으로 보임. 이거 안될때, 테이블 스타일에 이거 추가해주면 된다.

tyson.tistory.com

 

 

툴팁 만들때, 먼저, jquery, bootstrap를 추가해준다.

<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.6/umd/popper.min.js" integrity="sha384-wHAiFfRlMFy6i5SRaxvfOCifBUQy1xHdJ/yoi7FRNXMRBu5WHdZYu1hA6ZOblgut" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js" integrity="sha384-B0UglyR+jN6CkvvICOB2joaf5I4l3gm9GU6Hc1og6Ls7i6U/mkkaduKaBhlAXv9k" crossorigin="anonymous"></script>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css" integrity="sha384-GJzZqFGwb1QTTN6wy59ffF1BuGJpLSa9DkKMp0DgiMDm4iYMj70gZWKYbI706tWS" crossorigin="anonymous">

 

그리고, 자바스크립트에서 생성해주고,

클래스로 불러와서, 쓰면된다.

 

<script type="text/javascript">
    $(document).ready(function(){
        //tooltip 생성
        $(".tooltip_event").tooltip();
    });
</script>
 
<button class="tooltip_event" title="버튼 tooltip 입니다.">
    버튼 툴팁
</button>

 

툴립에 뜨길 원하는 텍스트는 title안에 적어주면 되고,

 

클래스에 tooltip_event를 추가해주면 된다.

 

 

 

 

 

참고, 블로그 :  https://allmana.tistory.com/96

https://kouzie.github.io/html/HTML-CSS-%ED%88%B4%ED%8C%81/#%ED%88%B4%ED%8C%81tooltip

Posted by Tyson
2021. 8. 23. 18:15

자바스크립트 같은 경우, 

 

변수 선언할때, var만 사용하였는데, 

ES2015(ES6)부터인가 생겼다.

 

간단하게 이야기하면, 

 

let은 수정 가능

const는 수정 불가능이다.

 

처음에는 그냥 var만 쓰면 되지... 굳이...라고, 생각했는데...

 

작업하다 보니, 

왠만한 변수는 다 const 로 선언하고, 필요한거만 let으로 했더니,

확실히 내가 놓치는 에러가 줄었다.

 

var도 사용 가능하지만, 

앞으로 왠만하면, const 사용을 권장한다.

 

그리고, 진짜, 변수가 바뀌어야 되는 상황에서만 let를 사용하는 방법을 권장한다.

 

 

ES6 호환 리스트에서 봐도, const, let은  거의 다 사용 가능하다.

 

https://kangax.github.io/compat-table/es6/#ie11

Posted by Tyson
2021. 8. 18. 11:18

자바스크립트 같은 경우, 

 

변수 선언할때, var만 사용하였는데, 

ES2015(ES6)부터인가 생겼다.

 

간단하게 이야기하면, 

 

let은 수정 가능

const는 수정 불가능이다.

 

처음에는 그냥 var만 쓰면 되지... 굳이...라고, 생각했는데...

 

작업하다 보니, 

왠만한 변수는 다 const 로 선언하고, 필요한거만 let으로 했더니,

확실히 내가 놓치는 에러가 줄었다.

 

var도 사용 가능하지만, 

앞으로 왠만하면, const 사용을 권장한다.

 

그리고, 진짜, 변수가 바뀌어야 되는 상황에서만 let를 사용하는 방법을 권장한다.

 

 

ES6 호환 리스트에서 봐도, const, let은  거의 다 사용 가능하다.

 

https://kangax.github.io/compat-table/es6/#ie11

Posted by Tyson
2021. 8. 18. 11:00

php 날코딩으로 검색  기능을 만드는데, 

문자열 검색을 해야한다.

예로, 사용자명, 사용자 번호, 두개를 같이 검색해야되고,

인덱스도 없어서.... like 검색을 하려니 너무 느려질거 같다.

 

그  경우, DB에서  like 검색보다는 INSTR 를  사용하는걸 추천한다.

조건절에,  

SELECT * FROM USER 
      WHERE INSTR(UPPER(REPLACE(USER_NM, ' ', '')),  UPPER(REPLACE('검색어',' ', ''))) > 0

INSTR 은 문자열이 포함되었는지 확인하는거고, 

UPPER.  소문자로 입력된것도 다  대분자로 치환한다.

REPLACE 그리고,  혹시 스페이스가 들어가 있을수있으니, 스페이스를 없애는 작업이다.

 

>0 은 값이 1개라도 있으면, 리턴되는거다.

 

위 쿼리문에 AND 붙여서 조건식 추가하면 된다.

 

어자피 검색해서, 포함된 문자열 검색해서 목록을 내려주면 된다.

 

INSTR이  like 보다, 훨씬 빠르고, 간편하다.

Posted by Tyson