2017년 2월 16일 목요일

[ORACLE] 시스템 SQL


1. Table space 사이즈 체크
 

SELECT TABLESPACE_NAME                                           ,
       ((EXTEND_BYTES/1024)/1024)||'M'                        EXT,
       ((USED_BYTES/1024)/1024)||'M'                         USED,
       ROUND(((USED_BYTES)/EXTEND_BYTES)*100,2) || '%'   USE_RATE,
       ((FREE_BYTES/1024)/1024)                              FREE,
       ROUND((1-((USED_BYTES)/EXTEND_BYTES))*100,2) || '%' FREE_RATE
  FROM (SELECT T1.TABLESPACE_NAME,
               T1.EXTEND_BYTES,
               T1.EXTEND_BYTES - T2.FREE_BYTES USED_BYTES,
               T2.FREE_BYTES
         FROM (SELECT TABLESPACE_NAME,
                      SUM(BYTES) EXTEND_BYTES
                 FROM DBA_DATA_FILES
                GROUP BY TABLESPACE_NAME ) T1,
              (SELECT TABLESPACE_NAME,
                      SUM(BYTES) FREE_BYTES
                 FROM DBA_FREE_SPACE
                GROUP BY TABLESPACE_NAME) T2
        WHERE T2.TABLESPACE_NAME = T1.TABLESPACE_NAME )
 ORDER BY TABLESPACE_NAME







2. Table space 사이즈 체크(다른것)

SELECT A.TABLESPACE_NAME,
       ROUND(A.BYTES_ALLOC / 1024 / 1024, 2) CURRENT_SIZE,
       ROUND(NVL(B.BYTES_FREE, 0) / 1024 / 1024, 2) FREE_SIZE,
       ROUND((A.BYTES_ALLOC - NVL(B.BYTES_FREE, 0)) / 1024 / 1024, 2) USED_SIZE,
       ROUND((NVL(B.BYTES_FREE, 0) / A.BYTES_ALLOC) * 100,2) FREE_RATE,
       100 - ROUND((NVL(B.BYTES_FREE, 0) / A.BYTES_ALLOC) * 100,2) USED_RATE,
       ROUND(MAXBYTES/1048576,2) MAX_SIZE
  FROM ( SELECT F.TABLESPACE_NAME,
                SUM(F.BYTES) BYTES_ALLOC,
                SUM(DECODE(F.AUTOEXTENSIBLE, 'YES',F.MAXBYTES,'NO', F.BYTES)) MAXBYTES
           FROM DBA_DATA_FILES F
                GROUP BY TABLESPACE_NAME) A,
                ( SELECT F.TABLESPACE_NAME,
                         SUM(F.BYTES)  BYTES_FREE
                    FROM DBA_FREE_SPACE F
                   GROUP BY TABLESPACE_NAME) B
 WHERE A.TABLESPACE_NAME = B.TABLESPACE_NAME (+)
UNION
SELECT TABLESPACE_NAME,
       ROUND(SUM(BYTES_USED + BYTES_FREE) / 1048576, 2),
       ROUND(SUM(BYTES_FREE) / 1048576,2),
       ROUND(SUM(BYTES_USED) / 1048576,2),
       ROUND((SUM(BYTES_FREE) / SUM(BYTES_USED + BYTES_FREE)) * 100,2) FREE_RATE,
       100 - ROUND((SUM(BYTES_FREE) / SUM(BYTES_USED + BYTES_FREE)) * 100,2) USED_RATE,
       ROUND(MAX(BYTES_USED + BYTES_FREE) / 1048576, 2)
  FROM SYS.V_$TEMP_SPACE_HEADER
 GROUP BY TABLESPACE_NAME
 ORDER BY 1;










 3. 테이블 사이즈 확인
SELECT SEGMENT_TYPE     ,
       SEGMENT_NAME    ,
       TABLESPACE_NAME ,
       (BYTES/1024) KB
  FROM USER_SEGMENTS
 WHERE SEGMENT_TYPE = 'TABLE'
 ORDER BY SEGMENT_TYPE,SEGMENT_NAME;



















4.테이블스페이스 파일 크기 확인
select tablespace_name, bytes/1024/1024 MB, file_name from dba_data_files 

5.Tablespace내 table 확인
 select * from tabs
 where tablespace_name = 'SYSTEM'




6.오라클 버전 확인
select * from v$version










2017년 2월 3일 금요일

라이센스(License) - 중복로그인(MultiLogon) 제한

[출처 : http://yongandju.tistory.com/ ]

SAP를 운영하다 보면 빡빡한 라이센스(License) 정책으로 인해 골치가 조금 아픕니다.

도입 시점에서는 별 문제 없다가도, 불시에 라이센스 검사(Audit)가 나와서 추가 구매를 해야한다고 하니까요.

게다가 비용도 만만치 않습니다ㅜ

듀얼 모니터의 추세로 인해 창을 여러개 띄워놓고 작업을 하게 되는데, 하나의 로그인으로는 5개의 창 밖에는

띄울 수 없는 구조도 중복 로그인을 하게 만드는 이유가 됩니다.

물론, 라이선스 계약(1 User / 1 License)은 반드시 준수해야 합니다.

라이선스 계약이 문제가 될 것이라고 판단 된다면 도입을 보류하던지 협상을 통해 원하는 결과를

이끌어 내야 합니다. 계약할 때는 몰랐다는 식의 대응은 기업의 신뢰도를 손상시키기 때문이죠.




여기서 어느 정도 유두리(?)를 SAP에서 인정해줘야 한다고 주장하는 것은

1 User / 1 License 정책 안에서 1 User가 여러 작업을 할 수 있도록 해달라는 점 입니다.

5개 밖에 띄울 수 없는 창의 개수를 늘려 주던지, 동일 IP에 대한 복수의 로그인을 인정해 줘야 한다는거죠 : )



각설하고, 오늘은 멀티로그인을 허용한 기업에서 최대 로그인을 제한하는 방안을 소개하고자 합니다.



로그인 프로세스 안에 Exit을 걸어두고 다음과 같은 기능을 하게 만드는 것이죠   

  ▶ 동시접속 4개 이상을 초과할 경우 강제 로그아웃
  ▶ 현재 접속한 내역 안내 팝업창
  ▶ 특수 계정은 중복 로그인 허용(ADMIN, INTERFACE 등)


먼저, Exit을 거는 위치는 아래와 같습니다.
  ▶ Function 그룹 : XUSR
  ▶ 모듈 : EXIT_SAPLSUSF_001
  ▶ INCLUDE : ZXUSRU01


소스코드는 하기와 같습니다. 최대 4개 로그인만 허용하도록 한 코드 입니다.
*&---------------------------------------------------------------------*
*&  Include           ZXUSRU01
*&---------------------------------------------------------------------*

TABLES: UINFO.
DATA: N TYPE I VALUE 5.         "<- 최대 허용 중복 로그인 수치
DATA: OPCODE TYPE X VALUE 2, I TYPE I, A(60), N_C(3), B(250), c(250), TEMP_A(250),
          TEMP_B(250), TEMP_C(250),TEMP_D(250).
DATA: I_n TYPE I VALUE 4.
DATA: BEGIN OF BDC_TAB1 OCCURS 5.
        INCLUDE STRUCTURE BDCDATA.
DATA: END OF BDC_TAB1.

DATA: BEGIN OF USR_TABL OCCURS 10.
        INCLUDE STRUCTURE UINFO.
DATA: END OF USR_TABL.

DATA: GT_USR41 LIKE USR41 OCCURS 0 WITH HEADER LINE.

* 예외처리할 ID있으면 아래에 표시
IF  SY-UNAME <> 'ADMIN'
      AND SY-UNAME <> 'SAP*'
      AND SY-UNAME <> 'INTERFACE'
      AND SY-UNAME <> 'DDIC'
      AND SY-UNAME <> 'DDID'
      AND SY-UNAME <> 'ALEREMOTE'
      AND SY-UNAME <> 'BWREMOTE'
      AND SY-UNAME <> 'IF_BIZTALK'
      AND SY-UNAME <> 'ALEREMOTE'
      AND SY-UNAME <> 'RSDUSER'
      AND SY-UNAME <> 'SAPCPIC'
      AND SY-UNAME <> 'TMSADM'.

CALL 'ThUsrInfo' ID 'OPCODE' FIELD OPCODE
  ID 'TAB' FIELD USR_TABL-*SYS*.

LOOP AT USR_TABL.
  IF SY-UNAME = USR_TABL-BNAME AND SY-MANDT = USR_TABL-MANDT.
    I = I + 1.
  ENDIF.

ENDLOOP.


  SELECT *
  INTO TABLE GT_USR41
  FROM USR41
  WHERE BNAME = SY-UNAME.

    I_n = 0.
    TEMP_C = ''.
    TEMP_D = ''.

  LOOP AT GT_USR41.
    TEMP_A  = GT_USR41-TERMINAL.
    TEMP_B  = '  /  '.
    I_n  = I_n + 1.
    IF I_n < 3 .
      CONCATENATE  TEMP_A TEMP_B TEMP_C INTO TEMP_C.
    ELSEIF I_N < 5.
      CONCATENATE  TEMP_A TEMP_B TEMP_D INTO TEMP_D.
    ENDIF.
  ENDLOOP.

IF I >= N.

    N_C = I - 1.

    CONCATENATE ''  SY-UNAME '  계정이 현재  '  N_C ' 개가  로그인  되어  있습니다' INTO A.

      CALL FUNCTION 'POPUP_TO_INFORM'
           EXPORTING
                TITEL = 'SAP ID 정책 위반 안내'
                TXT1  = A
                TXT2  = '중복 로그인 정책에 위반되어 종료 합니다, 접속된 PC명 : '
                TXT3  = TEMP_C
                TXT4 =  TEMP_D.

      MOVE: 'SAPMSSY0' TO BDC_TAB1-PROGRAM,
              '120' TO BDC_TAB1-DYNPRO,
              'X' TO BDC_TAB1-DYNBEGIN.
      APPEND BDC_TAB1.CLEAR BDC_TAB1.
      MOVE: 'BDC_OKCODE' TO BDC_TAB1-FNAM,
             '/nex' TO BDC_TAB1-FVAL.
      APPEND BDC_TAB1.CLEAR BDC_TAB1.

      CALL TRANSACTION 'SM04' USING BDC_TAB1 MODE 'N'.

ENDIF.
ENDIF.

메일 SMTP 오류 코드 정리

[ 출처 : http://sangchul.kr/ ]


400 에러(송신단계의 문제)

1. 421 Server too busy

- 수신 측 서버의 일시 장애로 연결이 안되는 현상으로 이는 수신 측 서버의 SMTP 세션이 Full 이거나 수신 측 서버의 트래픽으로 인해 새로운 SMTP 연결을 만들지 못하는 경우 발생할 수 있습니다. 잠시 후 다시 시도해 보거나 오류가 계속 될 경우 수신 측 관리자에게 문의 하시기 바랍니다.

2. 421-Microsoft ESMTP MAIL Service, Version: 5.0.2195.5600 ready at Service not available, closing transmission channel
- 수신 측 서버인 Microsoft ESMTP 서비스가 정상적으로 동작하지 않아 메일을 송신하지 못하는 오류입니다. 시 후 다시 시도해 보거나 오류가 계속 될 경우 수신 측 관리자에게 문의 하시기 바랍니다.

3. 421 4.3.1 ILLEGAL FROM <xxx@xxx.com> Sorry. Your IP has problems. This Connection will be closed. Please mail to mailsysop@hanmir.com (by using another e-mail server). Thank you.
- 송신 측의 아이피 주소 또는 메일주소가 잘못 되어 송신이 제한된 오류입니다. 안내되어진 메일주소로 문의 메일을 보내시기 바랍니다.

4. 421 4.3.2 Your IP(xxx.xxx.xxx.xxx) is filtered and this connection will be closed. You must register your IP to spammaster@hanafos.com By SpaceLee, the Lord of mail server
- 송신 측의 아이피 주소가 하나포스닷컴에 스팸 메일러로 등록이 되어 송신이 제한된 오류입니다. 안내되어진 메일주소로 문의 메일을 보내시기 바랍니다.

5. 421 4.3.2 Your IP(xxx.xxx.xxx.xxx) is filtered and this connection will be closed. You must register your IP to http://realip.naver.com.

- 송신 측의 아이피 주소가 네이버닷컴에 스팸 메일러로 등돌이 되어 송신이 제한된 오류입니다. 네이트닷컴의 스팸 정책을 참고하시기 바랍니다.

6. 441 4.4.1 No answer from host- 수신 측의 메일서버로부터 응답을 받지 못해 연결이 실패된 오류입니다. 잠시 후 다시 시도해 보거나 오류가 계속 될 경우 수신 측 관리자에게 문의 하시기 바랍니다.

7. 441 4.4.1 temporay dns failed <Hanmail.net>

- 한메일닷넷의 메일서버로 연결하던 도중 한메일의 스팸정책에 위배되어 발생한 오류입니다. 다음의 연락처로 연락해 보시기 바랍니다. 1544-0580 내선번호 2

8. 450 <xxx@xxx.xxx> : Recipient address rejected: Greylisted for 300 seconds (see http://isg.ee.ethz.ch/tools/postgrey/help)
- 송신 측의 메일주소가 수신측에서 참조하고 있는 Graylisting 시스템에 등록되어 메일발송이 지연되고 있는 오류입니다.

9. 451 4.4.0 DNS resolving error
- 수신 측 서버의 도메인을 찾지 못해 발생한 오류입니다. 현재 메일서버가 참조하고 있는 DNS 서버가 정상적으로 동작하는지 확인해 보시기 바랍니다. 또한 다른 ISP 업체들의 DNS를 참조하여 메일을 송신해 보시기 바랍니다.

10. 451 4.3.0 Other or undefined mail system status

- 수신 측 메일 시스템의 프로토콜이 틀리거나 연결된 서버가 SMTP 서버가 아닐경우 발생하는 오류입니다.

11. 451 4.3.0 Temporary system failure. Please try again later

- 수신 측 서버의 일시적인 장애로 인하여 메일을 수신하지 못하는 오류입니다.

12. 451 4.4.2 Bad connection (io timeout)

- 수신 측 서버의 응답시간 초과로 인하여 연결이 끊어져 발생한 오류입니다. 잠시 후 다시 시도해 보거나 오류가 계속 될 경우 수신 측 관리자에게 문의 하시기 바랍니다.

13. 451 Relay Server Not Ready
- 수신 측 서버의 릴레이 기능이 정상적으로 동작하지 않아 발생한 오류입니다. 잠시 후 다시 시도해 보거나 오류가 계속 될 경우 수신 측 관리자에게 문의 하시기 바랍니다.

14. 452 sorry, your recipient address is not in my local list
- 수신자의 메일주소가 수신 측의 메일서버에 존재하는 계정이 아니어서 발생한 오류입니다. 수신자의 메일주소를 올바르게 표기하였는지 확인해 보시기 바랍니다. 또한, 해당 주소가 실제 수신 측에 존재하는 계정인지 확인해 보시기 바랍니다.

15. 452 4.4.5 Requested mail action aborted: exceeded storage allocation

- 수신 측 메일서버의 저장공간 부족으로 인하여 발생한 오류입니다. 수신 측 관리자에게 문의 하시기 바랍니다.

16. 452 4.4.5 Disk write / Insufficient disk space error occurred
- 수신 측 메일서버의 저장공간 부족으로 인하여 발생한 오류입니다. 수신 측 관리자에게 문의 하시기 바랍니다.

17. 452 4.4.5 Insufficient disk space; try again later
- 수신 측 메일서버의 저장공간 부족으로 인하여 발생한 오류입니다. 수신 측 관리자에게 문의 하시기 바랍니다.

18. 452 4.4.5 MailBox or MessageQuota exceed for <E-mail Address>

- 수신자 메일 사서함의 공간부족으로 인하여 발생한 오류입니다. 수신 측 관리자에게 문의 하시기 바랍니다.


500 에러(수신단계의 문제)

1. 5XX you must be spam
- 송신 측의 메일서버의 도메인 또는 IP 주소 또는 송신자의 메일주소가 수신 측의 메일서버에 스패머로 등록되어 발생한 오류입니다. 수신 측 관리자에게 문의 하여 스팸 리스트에서 삭제하시기 바랍니다.

2. 5XX Your envelope sender is enlisted as spammer

- 송신자의 메일주소가 수신 측의 메일서버에 스패머로 등록되어 발생한 오류입니다. 수신 측 관리자에게 문의 하여 스팸 리스트에서 삭제하시기 바랍니다.

3. 500 Syntax error, command unrecognized
- SMTP 명령어 중 일부 누락 또는 일부 잘못된 명령어로 인하여 발생한 오류입니다.

4. 500 File Sending Error
- 메일 메시지 전송도중 네트웍 장애등의 이유로 전송에 실패하여 발생한 오류입니다.

5. 501 Denied domain name
- 송신 측의 도메인이 수신 측의 서버에서 거부되어 발생한 오류입니다.

6. 501 Bad sender address expression
- 송신자 또는 수신자의 메일주소가 정상적이지 않아 발생한 오류입니다. 송신자의 메일주소가 정확한지 확인해 보시기 바랍니다.

7. 501 Argument missing

- SMTP 명령어 중 일부 누락 또는 일부 잘못된 명령어로 인하여 발생한 오류입니다.

8. 501 5.1.8 Sender domain must exist <xxx.com>
- 수신 측 xxx.com 도메인이 존재하지 않아 발생한 오류입니다. 수신자 메일수조 중 도메인 부분이 정확하게 적혀있는 지 확인하시기 바랍니다. 주소가 정확한 경우 수신 측 관리자에게 문의하여 실제 도메인이 해당 메일서버에 등록되어 있는지 확인하시기 바랍니다.

9. 503 Bad sequence of commands
- SMTP 명령어 중 일부 누락 또는 일부 잘못된 명령어로 인하여 발생한 오류입니다.

10. 504 You are registered as spammer
- 송신 측의 메일서버의 도메인 또는 IP 주소 또는 송신자의 메일주소가 수신 측의 메일서버에 스패머로 등록되어 발생한 오류입니다. 수신 측 관리자에게 문의 하여 스팸 리스트에서 삭제하시기 바랍니다.

11. 504 We do not accept mail from spammers. if you have questions,please Email

- 송신 측의 메일서버의 도메인 또는 IP 주소 또는 송신자의 메일주소가 수신 측의 메일서버에 스패머로 등록되어 발생한 오류입니다. 수신 측 관리자에게 문의 하여 스팸 리스트에서 삭제하시기 바랍니다.

12. 511 sorry, no mailbox here by that name (#5.1.1 - chkuser)
- 수신자의 메일주소가 수신 측의 메일서버에 존재하지 않는 계정인 경우 발생하는 오류입니다. 수신자의 메일 주소가 정확한지 확인해 보시기 바랍니다. 또한 수신자의 계정이 실제 존재하는지 사용가능한 상태인지 수신 측 관리자에게 문의하시기 바랍니다.

13. 550 No inbox for <E-mail Address>
- 수신자의 메일주소가 실제 존재하지 않는 계정이거나 사용 중지된 계정상태로 인하여 발생한 오류입니다. 수신자의 메일 주소가 정확한지 확인해 보시기 바랍니다. 또한 수신자의 계정이 실제 존재하는지 사용가능한 상태인지 수신 측 관리자에게 문의하시기 바랍니다.

14. 550 User unknown

- 수신자의 메일주소가 실제 존재하지 않는 계정이거나 사용 중지된 계정상태로 인하여 발생한 오류입니다. 수신자의 메일 주소가 정확한지 확인해 보시기 바랍니다. 또한 수신자의 계정이 실제 존재하는지 사용가능한 상태인지 수신 측 관리자에게 문의하시기 바랍니다.

15. 550 Requested action not taken: mailbox unavailable

- 수신자의 메일주소가 실제 존재하지 않는 계정이거나 사용 중지된 계정상태로 인하여 발생한 오류입니다. 수신자의 메일 주소가 정확한지 확인해 보시기 바랍니다. 또한 수신자의 계정이 실제 존재하는지 사용가능한 상태인지 수신 측 관리자에게 문의하시기 바랍니다.

16. 550 5.1.1 Suspended mailbox
- 수신자의 메일주소가 실제 존재하지 않는 계정이거나 사용 중지된 계정상태로 인하여 발생한 오류입니다. 수신자의 메일 주소가 정확한지 확인해 보시기 바랍니다. 또한 수신자의 계정이 실제 존재하는지 사용가능한 상태인지 수신 측 관리자에게 문의하시기 바랍니다.

17. 550 5.1.1 No such user <E-mail Address>
- 수신자의 메일주소가 실제 존재하지 않는 계정이거나 사용 중지된 계정상태로 인하여 발생한 오류입니다. 수신자의 메일 주소가 정확한지 확인해 보시기 바랍니다. 또한 수신자의 계정이 실제 존재하는지 사용가능한 상태인지 수신 측 관리자에게 문의하시기 바랍니다.

18. 550 Invalid recipient
- 수신자의 메일주소가 실제 존재하지 않는 계정이거나 사용 중지된 계정상태로 인하여 발생한 오류입니다. 수신자의 메일 주소가 정확한지 확인해 보시기 바랍니다. 또한 수신자의 계정이 실제 존재하는지 사용가능한 상태인지 수신 측 관리자에게 문의하시기 바랍니다.

19. 550 5.0.0 Access denied
- 수신 측 메일서버로의 접속이 거부되어 발생한 오류입니다. 수신 측 메일서버에 송신 측의 메일서버가 거부되어 있는지 확인해 보시기 바랍니다.

20. 553 sorry, that domain isn't in my list of allowed rcpt hosts

- 수신 측의 도메인주소가 수신 측 메일서버에 존재하지 않아 발생한 오류입니다. 수신자의 메일 주소가 정확한지 확인해 보시기 바랍니다. 또한 수신 측의 도메인 주소가 수신 측 메일서버에 존재하는지 확인해 보시기 바랍니다.

21. 550 Relay rejected for <E-Mail Address>
- 수신 측의 메일서버에서 해당 E-Mail Address 로 릴레이를 거부하여 발생한 오류입니다. 수신 측 관리자에게 문의하시기 바랍니다.

22. 550 relaying to <E-Mail Address> prohibited by administrator
- 수신 측의 메일서버에서 해당 E-Mail Address 로 릴레이를 거부하여 발생한 오류입니다. 수신 측 관리자에게 문의하시기 바랍니다.

23. 553 Too many recipients
- 수신 측 메일서버에서 허용한 동시 수신 메일 수를 초과하여 발생한 오류입니다. 수신 측 메일서버에서 허용한 수 이하로 메일을 송신해 보시기 바랍니다.

24. 553 sorry, your envelope sender is in my badmailfrom list.
- 송신 측의 메일서버의 도메인 또는 IP 주소 또는 송신자의 메일주소가 수신 측의 메일서버에 스패머로 등록되어 발생한 오류입니다. 수신 측 관리자에게 문의 하여 스팸 리스트에서 삭제하시기 바랍니다.

25. 553 sorry, your envelope sender is enlisted as spammer
- 송신 측의 메일서버의 도메인 또는 IP 주소 또는 송신자의 메일주소가 수신 측의 메일서버에 스패머로 등록되어 발생한 오류입니다. 수신 측 관리자에게 문의 하여 스팸 리스트에서 삭제하시기 바랍니다.

26. 550 5.0.0 Your message may contain the Klez.worm! See http://securityresponse.symantec.com/avcenter/venc/data/w32.klez.removal.tool.html
- 송신한 메일 메시지 않에 Klez worm 바이러스가 포함되어 수신 측 메일서버에서 거부된 오류입니다. 클라이언트 및 서버의 상태를 점검해 보시기 바랍니다. 또한 첨부 파일이 있을 경우 첨부 파일에 바이러스가 포함되지 않았는지 확인해 보신 후 재 전송하시기 바랍니다.

27. 553 5.0.0 Your message may contain the Win32.Klez worm!!- If you have questions,please email
- 송신한 메일 메시지 안에 Win32.Klez worm 바이러스가 포함되어 수신 측 메일서버에서 거부된 오류입니다. 클라이언트 및 서버의 상태를 점검해 보시기 바랍니다. 또한 첨부 파일이 있을 경우 첨부 파일에 바이러스가 포함되지 않았는지 확인해 보신 후 재 전송하시기 바랍니다.

28. 553 5.5.4 Host name (xxx.com) is not match with your ip(xxx.xxx.xxx.xxx), maybe it's bogus. Visit http://antispam.hanmail.net
- 수신 측의 메일서버에서 송신 도메인 xxx.com 에 대하여 DNS Lookup 한 결과 송신된 IP 주소인 xxx.xxx.xxx.xxx 와 일치 하지 않아 송신이 거부된 오류 입니다. 송신 측 도메인에 대한 호스트(A) 레코드 생성 후 이를 송신 측 메일서버의 아이피 주소와 일치시켜 주시기 바랍니다.

29. 553 5.5.4 <xxx> ... Domain name required for sender address <xxx>
- 송신 측의 메일주소가 ID@Domain_Name 형식이 아닌 잘못된 형식으로 송신을 시도하여 발생한 오류 입니다. 송신자의 메일주소가 올바른지 확인해 보시기 바랍니다.

30. 554 5.3.4 Too big mail sent. Max allowed mail size is xxxxxxxxx bytes
- 수신 측 메일서버에서 허용한 메일 사이즈보다 큰 메일을 송신하여 발생한 오류입니다. 송신 메일의 사이즈를 점검하여 허용 사이즈 이하로 재 전송해 보시기 바랍니다.

31. 554 5.3.0 Mail have traversed Too many hops. Reject it
- 수신 측 메일서버에서 허용한 동시 수신 메일 수를 초과하여 발생한 오류입니다. 수신 측 메일서버에서 허용한 수 이하로 메일을 송신해 보시기 바랍니다.

32. 554 delivery error: dd Sorry, your message to <E-Mail Address> cannot be delivered. This account is over quota
- 수신자의 메일사서함 용량이 초과되어 메일을 수신하지 못하는 오류 입니다. 수신 측 관리자에게 문의 하시기 바랍니다.

33. 554 5.1.0 Sender Denied
- 송신 측의 메일주소가 거부되어 발생한 오류입니다. 수신 측 관리자에게 문의 하시기 바랍니다.

34. 554 5.5.0 Your message was rejected. Please refer to http://antispam.nate.com/554-550.html [Reject Option]
- 네이트 닷컴의 스팸 정책에 위배되어 메일을 송신하지 못한 오류입니다. 네이트 닷컴의 스팸 정책을 확인해 보시기 바랍니다.

35. 554 delivery error: dd This user doesn't have a yahoo.com account (E-Mail Address) [-5] - mta114.mail.sc5.yahoo.com
- 수신자의 메일주소가 야후닷컴에 실재 존재하지 않은 계정인 경우 발생하는 오류입니다. 수신자의 메일주소를 정확하게 입력하였는지 확인해 보시기 바랍니다.

36. 550 5.7.1 <E-Mail Address>. Relaying denied. IP name lookup failed <IP Address>

- 송신자의 메일주소가 DNS IP Name Lookup 에 실패하여 릴레이가 거부된 오류입니다. 송신 측 DNS 서버의 정방향 조회 영역에 송신 측 메일서버 IP Address 와 일치하는 메일교환기(MX) 레코드 값이 정확하게 설정되어 있는지 확인해보시기 바랍니다. 또한, 송신 측 DNS 서버의 역방향 조회 영역에 송신 측 메일서버 IP Address에 대하여 포인터가 올바르게 구성되어 있는지 확인해 보시기 바랍니다.

37. 550 5.5.0 VIRUS detected from your mail. Cure & Try again. Found by virus scan engine.
- 송신한 메일 메시지 안에 바이러스가 포함되어 수신 측에서 거부된 오류입니다. 클라이언트 및 서버의 상태를 점검해 보시기 바랍니다. 또한 첨부 파일이 있을 경우 첨부 파일에 바이러스가 포함되지 않았는지 확인해 보신 후 재 전송하시기 바랍니다.

38. 550 Denied by policy: Sender is listed on DNS-based RBL
- 송신 측의 메일서버의 도메인 또는 IP 주소 또는 송신자의 메일주소가 RBL (Real time Black List) 에 포함되어 수신 측의 메일서버에서 거부되어 발생한 오류입니다. 송신 측의 도메인 또는 아이피 주소가 등록되어 있는 RBL을 확인하여 리스트에서 제거하시기 바랍니다. 리스트에서 제거하는 방법은 RBL 사이트 마다 다르며 해당 사이트의 지시를 따르시기 바랍니다.

39. 550 Mail sender unuses allowed IP. SMTP Proxy Server close ...
- 송신 측의 IP Address 가 수신 측의 메일서버에서 거부되어 발생한 오류입니다. 수신 측 관리자에게 문의하여 송신 측의 IP가 거부되어 있는지 확인하신 후 삭제하시기 바랍니다.

40. 553 5.5.3 <E-Mail Address>... Invalid
- 송신자 또는 수신자의 메일주소가 잘못되어 발생한 오류입니다. 송신자 또는 수신자의 메일주소가 올바른지 확인해 보시기 바랍니다.

41. 557 you must be virus
- 송신자의 메일이 바이러스로 인식되어 수신 측에서 거부된 오류입니다. 클라이언트 및 서버의 상태를 점검해 보시기 바랍니다. 또한 첨부 파일이 있을 경우 첨부 파일에 바이러스가 포함되지 않았는지 확인해 보신 후 재 전송하시기 바랍니다.

기타 에러

1. Error-Connect

- 네트웍의 장애 또는 수신 측 메일서버의 장애 또는 기타의 이유로 송신 측과 수신 측 사이에 연결이 이루어지지 않아 발생한 오류입니다. 네트웍 또는 송, 수신 측의 메일서버 상태를 점검 후 재 시도 해보시기 바랍니다.

2. Temporary system failure
- 송신 측 또는 수신 측 메일서버 또는 네트웍의 일시적인 장애입니다. 재시도 결과 같은 현상이 반복될 경우 메일서버 및 네트웍의 전반적인 상태를 점검해 보시기 바랍니다.

3. No SMTP server

- 송신 측의 메일서버에서 참조 하고 있는 DNS 서버에서 수신 측의 메일서버를 찾지 못하였거나 실제로 수신 측의 메일서버가 존재하지 않아 발생한 오류입니다. 송신 측의 DNS 서버가 정상적으로 운영 중인지 확인하신 후 이상이 없으실 경우 수신 측의 메일서버가 존재하고 있는지 확인해 보시기 바랍니다.

4. An error occurred attempting to connect to the DNS Server(s) Additional error information: The following exception occurred attempting to connect to <IP>
- 송신 측의 메일서버가 참조하고 있는 DNS 서버에 연결하려고 하였으나 연결하지 못해 발생한 오류입니다. DNS 서버가 정상적으로 동작하고 있는지 확인해 보시기 바랍니다.

5. Error Data Sending
- 송신 측과 수신 측의 메일서버 연결은 정상적으로 이루어 졌으나 실제 메일 데이터를 전송하는 과정에서 정상적으로 전송하지 못해 발생한 오류입니다. 현재 네트웍 상태가 정상적인지 확인해 보신 후 재시도 해보시기바랍니다.

6. Error Sending Timeout

- 메일 데이터를 전송하는 과정에서 지정된 시간 내에 전송하지 못해 발생한 오류입니다. 현재 네트웍 상태가 정상적인지 확인해 보신 후 재시도 해보시기 바랍니다.

아웃룩 에러

1. 메일 서버에 로그온하는 데 문제가 있습니다. 지정한 암호가 거부되었습니다. 계정 : <mail.test.com>, 서버: <mail.test.co.kr>, 프로토콜: POP3, 서버 응답: <-ERR Bad login>, 포트: 110, 보안(SSL): 아니오, 서버 오류: 0x800CCC90, 오류 번호: 0x800CCC92
- 아웃룩에서 [도구]->[계정]->[등록정보]->[서버]->비밀번호변경 또는 SiteControl에 로그인후 [계정관리자] ->[비밀번호 변경]을 통하여 비밀번호를 다시 지정하시기 바랍니다. 간혹 메일 계정 용량 초과 사용하실때도 이와 같이 나타납니다.

2. <mail.test.com> 호스트를 찾을 수 없습니다. 서버 이름을 올바르게 입력했는지 확인하십시오. 계정: <admin>, 서버: <mail.test.com>, 프로토콜: POP3, 포트: 110, 보안(SSL): 아니오, 소켓 오류: 11001, 오류 번호: 0x800CCC0D서버에 연결할 수 없습니다. 계정: <mail.xxxx.xx.>
- POP3 이름을 다시 정확히 확인후 POP3 서버명을 수정해 주시기 바랍니다.
예>인에이지 POP3 : mail.test.com

3. [서버에 연결할 수 없습니다. 계정: <mail.xxxx.xx.xx>, 서버: <127.0.0.1>, 프로토콜: POP3, 포트: 1110, 보안(SSL): 아니오, 소켓 오류: 10061, 오류 번호: 0x800CCC0E]

- V3Pro 2002 Deluxe를 설치하여 [POP3 감시], [Outlook 감시]를 [On]하시면 Outlook Express의 계정부분에 127.0.0.1과 같이 Local의 IP가 덧붙여 지게 됩니다.
받는 메일 서버 : 127.0.0.1
계정 이름 : 계정 이름/원래 메일 서버 주소/110 [127.0.0.1]는 가상의 프록시 서버로 고객님께서 메일을 받으시기 전 미리 바이러스 검사를 하도록 되어 있습니다
만약 계정변경 후 POP3 감시의 에러가 발생해 위와 같이 세팅된 상태에서 POP3 감시 모듈이 정상 작동을 하지 않는다면 메일을 수신할 수 없게 됩니다. 그러한 경우에는 아래와 같은 방법으로 조치해 주시면 됩니다.

(1) V3Pro 2002 Deluxe의 실시간 감시에서 POP3 감시, Outlook 감시를 Off 시킵니다.
(2) V3와 Outlook Express를 모두 종료한 다음 다시 Outlook Express를 실행하여 [도구]-[계정]-[메일]에서 POP3 감시를 설정한 계정을 선택합니다.
[등록정보]->[고급]에서 서버 포트 설정을 받는 메일을 110으로 바꾸어 주신 후, V3Pro 2002 Deluxe에서 POP3 감시와 Outlook 감시를 다시 On으로 설정을 변경해 주시면 정상적으로 송수신이 됩니다.

4. 서버 연결이 갑자기 종료되었습니다. 서버 문제, 네트워크 문제 또는 연결해 놓고 장시간 사용하지 않은 것이 원인일 수 있습니다. 계정 : <xxxxxxx>, 서버 :<mail.xxxxx.xxx>, 프로토콜: POP3, 서버 응답: <+OK 4096 octers>, 포트: 110, 보안(SSL): 아니오, 오류번호: 0x800CCC0F
- 원인은 PC에 설치된 백신 소프트웨어 혹은 하드웨어가 있을때 발생합니다. 백신 소프트웨어 혹은 하드웨어가 서버에서 다운로드되는 이메일을 검사하여, 메일중에 바이러스로 의심되는 이메일이 존재할때, PC의 안전을 위하여 서버와의 연결을 중도에 끊습니다.
그러므로, 이때의 해결방법은 웹메일로 로그인을 하여 바이러스에 감염이 된 것으로 의심되는 화일을 삭제한 후 다시 다운로드 받으면 됩니다.
(즉, 메일중 광고성 메일이나 미확인 발신자로부터의 메일을 삭제조치하시면 됩니다.)

5. <mail.test.com> 호스트를 찾을 수 없습니다. 서버 이름을 올바르게 입력했는지 확인하십시오. 계정: <orbiter>, 서버: <mail.test.com>, 프로토콜: SMTP, 포트: 25, 보안(SSL): 아니오, 소켓 오류: 11001, 오류번호: 0x800CCC0D

- SMTP 서버 이름을 다시 정확히 확인후 수정하여 주시기 바랍니다.
SMTP 서버의 이름은 다음과 같습니다.
SMTP/POP3 : [gw.고객사도메인명] or [mail.고객사도메인명]

6. <mail.test.com> 호스트를 찾을 수 없습니다. 서버 이름을 올바르게 입력했는지 확인하십시오. 계정: <orbiter>, 서버: <mail30.test.com>, 프로토콜: SMTP, 포트: 25, 보안(SSL): 아니오, 소켓 오류: 11004, 오류 번호: 0x800CCC0D
- 받는 메일(POP3) 값이 제대로 되었는지 확인 (※ V3 백신 구 버젼을 사용하실 경우 위와 같이 포트 값이 1110으로 바뀝니다. V3를 삭제 하신 후 메일 계정을 다시 설정하시기 바랍니다.)

7. 받는 사람 중 한 사람이 서버에서 거부되었으므로 메시지를 보낼 수 없습니다. 거부된 전자 메일 주소는 <test@test.com> 제목 <test>, 계정: <test>, 서버: <test.com>, 프로토콜: SMTP, 서버 응답: [553 RCPT <test@test.com> ERROR. Relaying not allowed], 포트: 25, 보안(SSL): 아니오, 서버 오류: 553, 오류 번호: 0x800CCC79
- 해결방안1
이때는 현재 사용하시는 인터넷 회선 제공업체를 다시 확인하시고 그에 맞는 해당 업체의 SMTP 서버명으로 SMTP 를 설정하셔서 메일을 보내셔야 합니다. 각 통신사 마다 통신사의 회원에게만 SMTP를 사용하도록 설정이 되어 있으므로 타통신사를 통하여 메일을 발송할 수는 없습니다.

- 해결방안2
[도구] - [계정] - [메일] - 셋팅한 메일의 [등록정보] - [서버]에서 제일 밑부분의 보내는 메일서버에서 인증 필요를 체크해주시고 다시 연결 시도

8. 보안 암호 인증을 사용하여 서버에 로그온할 수 없습니다. 계정: <test.co.kr>, 서버: <test.co.kr>, 프로토콜: POP3, 서버 응답: <.>, 포트: 110, 보안(SSL): 아니오, 오류 번호: 0x800CCC18
- [도구] - [계정] - [메일] -> 셋팅한 메일의 [등록정보] -> [서버] 부분에서 -> 보안 암호 인증(SPA)을 사용하여 로그온 체크 해지

2017년 2월 1일 수요일

[Arduino] 온습도센서 값을 mysql에 저장

[ 출처 : http://blog.naver.com/sealclear/ ]

[정보]
 - DHT11 온습도센서
 - DHT 라이브러리를 추가하였음
 - 이더넷 쉴드를 장착함.
 - PHP사용하여 DB에 온습도 값 저장
 - MYSQL 테이블 세팅 







[증상 그리고 시도해본 것들]
 - 웹페이지에 접속할 때마다 db에 0값이 들어감
 - 자바스크립트로 자동 refresh 기능을 넣었는데... refresh될 때마다 db에 0값이 들어감
 - 자바스크립트 문제라 판단하여 자바스크립트 소스를 삭제하고 수동으로 refresh를 해보면 똑같이 db에 0이 들어간다.
 - 웃긴 건 php insert 쪽 쿼리문에 if문을 삽입하여 온습도 변수 값이 0인경우 쿼리문을 삽입하지 마라는 조건을 넣었는데... 그 조건을 넣으면 db에 아무런 값이 입력되지 않음.
   근데 지금은 됨... ㅡ ㅅ ㅡ... 저기서 추측컨데 아두이노에서 그럼 0을 보내는건가? 해서 아두이노 소스에 리딩값이 0이면 보내지 마 라는 조건문을 넣었지만 실패...
 - 커넥시간으로 인하여... 즉 온습도 값을 db에 삽입해, 그리고 소팅해서 맨 마지막 레코드를 출력해라는 쿼리가 있는데.. 두번째 쿼리인 경우 시간이 걸린다.. 근데.. 소팅이 완
   료되기 전에 다음 문장을 읽는다면.. 로스가 생기기때문에 0이들어간다고 생각하여 sleep문을 삽입하여 딜레이를 줬었다.. 그래도 db에 여전히 0값이 들어갔었었다...
 - php안에 전역변수와 함수를 만들고  소팅해서 맨 마지막 레코드를 읽을 때 0이 아닌것을 읽어라 라는 소스를 만들었었는데... 함수 외부에 있는 전역변수는 결론적으로 loop
   되는 문장안에 있어서 언젠가는 값이 날라가게 되어 있다... 그래서 슈퍼 전역변수를 사용하려고 했는데... 생각해보면... db에 원인을 알수 없지만 0이 들어간다.. 그런데 해
   결을 못하겠다... 그래서... 0이 아닌것을 읽곘다... 이러면... 트러블슈팅을 하는게 아니라.. 회피하는거라서... 이 방법은 아니라고 생각하고 포기함



[결론]
 - 웹페이지 refresh 마다 db에 0이 들어가는 문제가 해결되었음



[소스]
- 아두이노-
#include "DHT.h"  //DHT 온습도 센서 라이브러리 사용
#include <SPI.h>
#include <Client.h>
#include <Ethernet.h>
#define DHTPIN 2        //디지털 2번 핀 사용
#define DHTTYPE DHT11   // DHT11 사용
byte mac[] = { 0x90, 0xA2, 0xDA, 0x0E, 0xF1, 0x67 };
char server[] = "192.168.0.222"; //접속할 서버 주소 APMSETUP이 실행중인 컴퓨터의 ip
IPAddress ip(192,168,0,215);     //아두이노에 부여하는 ip (고정ip부여함)
IPAddress gateway(192,168,0,1);
IPAddress subnet(255,255,255,0);
EthernetClient client;
DHT dht(DHTPIN, DHTTYPE);  //DHT 라이브러리에 포함된 함수 형태정의
void setup() {
  dht.begin();  //온습도 센서 동작시작
  Serial.println("Sensor Ready");

  Ethernet.begin(mac, ip, gateway, subnet); //이더넷 연결 시작
  Serial.begin(9600);  //시리얼 통신 시작
  delay(1000);
  Serial.println("connecting...");
}
void loop() {
  int humidity = dht.readHumidity();         //습도 읽어
  int temperature = dht.readTemperature();   //온도 읽어
  if(humidity!=0 && temperature!=0) //온습도가 0이면 MYSQL에 값 보내지 마
  {
    if (client.connect(server, 80)) {   // Http 요청 헤더
      client.print( "GET /test6.php?"); //읽을 PHP 파일
      client.print("humidity=");
      client.print( humidity );
      client.print("&&");
      client.print("temperature=");
      client.print( temperature );      //여기까지는 PHP에서 받기로한 데이터들이다
      client.println( " HTTP/1.1");
      client.println( "Host: 192.168.0.222" ); //요청을 보낼 서버의 주소
      client.println( "Content-Type: application/x-www-form-urlencoded" );   
      client.println( "Connection: close" );
      client.println();
      client.stop();
      Serial.print("Current humdity = "); 
      Serial.print(humidity);
      Serial.print("%  ");
      Serial.print("temperature = ");
      Serial.print(temperature);
      Serial.println("C  ");
      Serial.println("OK");
    }  
  }
  delay(5000); //5초에 한번씩 센서 리딩
}

-php-
<?php
  //php info
  $mysql_hostname = 'localhost';
  $mysql_username = 'root';
  $mysql_password = 'apmsetup';
  $mysql_database = 'arduino';

  //DB연결
  $connect = new mysqli($mysql_hostname, $mysql_username, $mysql_password, $mysql_database);
  //DB연결 확인
  if($connect->connect_errno){
 echo '[연결실패] : '.$connect->connect_error.'<br>';
  } else {
 echo '[연결성공]<br>';
  }
   $humidity = $_GET['humidity'];         //습도 읽어와
   $temperature = $_GET['temperature'];   //온도 읽어와
 
   if($humidity!=0){    //온습도 값을 DB에 삽입하는 쿼리
    $query = "insert into temp(humidity, temperature) values('$humidity', '$temperature')";
    $connect->query($query);  //쿼리실행
   }
 
   do {  //맨 마지막 레코드를 읽는 쿼리
 $query3 = "select * from temp order by no desc limit 1;";
    $result = $connect->query($query3);  //쿼리실행
    $row = mysqli_fetch_object($result); //실행된 쿼리값을 읽음
   } while($row->humidity == 0);

   echo date("Y-m-d H:i:s") . "<br />\n";  //날짜와 시간 표시
   echo "$row->no  ";
   echo "$row->humidity  ";
   echo "$row->temperature";
   if($row->temperature>27) { //온도가 27도 넘으면 경보음 울림(로컬 컴퓨터 하단경로에 MP3파일 넣을 것)
 echo '<embed src="c:\test.mp3" loop=-1> </embed>';  
   }

 //하단 자바스크립트: 웹페이지 자동 REFRESH기능
?>
<script language='javascript'>
  window.setTimeout('window.location.reload()',6000); //1초마다 리플리쉬 시킨다 1000이 1초가 된다.
</script>