====== Oracle Database ====== * [[database:oracle:jdbc|Oracle JDBC Driver]] ===== Docker Images ===== * [[https://hub.docker.com/r/wnameless/oracle-xe-11g-r2|wnameless/oracle-xe-11g-r2]] * [[https://hub.docker.com/r/oracleinanutshell/oracle-xe-11g|oracleinanutshell/oracle-xe-11g - Docker Hub]] * [[https://www.sysnet.pe.kr/2/0/12191|개발 환경 구성: 483. docker - OracleXE 컨테이너 실행]] * [[https://hub.docker.com/r/jaspeen/oracle-11g|jaspeen/oracle-11g - Docker Hub]] * [[https://hub.docker.com/r/jaspeen/oracle-xe-11g|jaspeen/oracle-xe-11g - Docker Hub]] - https://github.com/jaspeen/docker-oracle-xe-11g * [[https://hub.docker.com/_/oracle-database-enterprise-edition|Oracle Database Enterprise Edition - Docker Hub]] * [[https://medium.com/@pakss328/docker-oracle-%EA%B8%B0%EB%B3%B8-%EC%85%8B%ED%8C%85-a09bf869cb59|docker oracle 기본 셋팅 - 박상수 - Medium]] * [[https://github.com/steveswinsburg/oracle12c-docker|steveswingsburg/oracle12c]] * [[https://emflant.tistory.com/237|(docker) oracle xe 18c 설치 및 sqlplus 접속하기 :: SourceBox]] * [[https://github.com/oracle/docker-images|oracle/docker-images: Official source for Docker configurations, images, and examples of Dockerfiles for Oracle products and projects]] ===== Docker 로 설치 ===== * [[https://github.com/oracle/docker-images/issues/959|Docker 로 Oracle 설치시에 all_objects 조회가 엄청나게 느린 현상이 발생함]] * [[java:junit:dbunit|DBUnit]], [[java:junit:database_rider|database-rider]] 에서 문제됨. * docker 기반이 아닐 경우 1초 정도에 실행 끝남. * [[https://stackoverflow.com/questions/37722685/oracle-11g-docker-select-very-slow|sql - Oracle 11g docker SELECT very slow - Stack Overflow]] ''asynch_io'' 를 꺼야 성능이 좋아진다는 내용 * [[https://hub.docker.com/r/wnameless/oracle-xe-11g-r2|wnameless/oracle-xe-11g-r2]] [[https://github.com/wnameless/docker-oracle-xe-11g|github]] docker run -d --name==oracle11gr2 \ -p 49161:1521 \ -p 49180:8080 \ -e ORACLE_ALLOW_REMOTE=true -e ORACLE_DISABLE_ASYNCH_IO=true # 필수!! all_objects 조회를 위해서. wnameless/oracle-xe-11g-r2 * 접속정보 hostname: localhost port: 49161 # container port 1521 sid: xe username: system password: oracle * APEX ''http://localhost:/apex/apex_admin'' 접속 # container port 8080 username: ADMIN password: admin * sqlplus docker exec -it -u oracle:dba oracle11gr2 /bin/bash # sqlplus 실행 sqlplus "SYS/oracle" AS SYSDBA ===== Table Space와 사용자 추가 ===== * [[https://blueray21.tistory.com/35|블루레이 :: [Oracle] CREATE TABLESPACE]] * [[https://12bme.tistory.com/300|[오라클] 테이블스페이스와 데이터파일]] -- Table Sapace 추가 CREATE TABLESPACE DATAFILE '.dbf' SIZE 100M AUTOEXTEND ON NEXT 10M; CREATE USER IDENTIFIED BY DEFAULT TABLESPACE QUOTA UNLIMITED ON TEMPORARY TABLESPACE TEMP; GRANT CONNECT, RESOURCE TO ; * 이제 '''' 사용자로 접속해서 작업한다. * 가급적 ''system'' 계정으로는 작업하지 말 것. ===== Version 확인 ===== * [[https://community.oracle.com/thread/2250946|How to check the Oracle database version | Oracle Community]] SELECT * FROM V$VERSION; SELECT version FROM V$INSTANCE; ===== charset / characterset ===== * 확인 select * from nls_database_parameters where parameter like '%CHARACTERSET%'; -- NLS_CHARACTERSET : AL32UTF8 -- NLS_NCHAR_CHARACTERSET : AL16UTF16 select VALUE$ from sys.props$ where name='NLS_LANGUAGE'; SELECT * FROM nls_database_parameters where parameter = 'NLS_LANGUAGE' -- AMERICAN * SQL을 이용한 변경 - 아래는 ''KO16MSWIN949''로 변경하는 예인데, 되도록 ''AL32UTF8'' 사용할 것. update props$ set value$='KO16MSWIN949' where name='NLS_CHARACTERSET'; update props$ set value$='AL16UTF16' where name='NLS_NCHAR_CHARACTERSET'; update sys.props$ set value$='KOREAN_KOREA.UTF8' where name='NLS_LANGUAGE'; commit; -- 모든 데이터베이스에 일괄 적용. 아래 작업을 안하면 오류 발생했음. -- ORA-06552: PL/SQL: Compilation unit analysis terminated -- ORA-06553: PLS-553: 알 수 없는 문자 집합 이름입니다 -- ORA-06553: PLS-553: character set name is not recognized ALTER SYSTEM ENABLE RESTRICTED SESSION; ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0; ALTER SYSTEM SET AQ_TM_PROCESSES=0; ALTER DATABASE CHARACTER SET INTERNAL_USE KO16MSWIN949; ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USE AL16UTF16; -- 재시작 shutdown immediate startup * 문자셋 종류 * ''KO16KSC5601'' : 완성형 한글, 한글2350글자. 한글 2bytes 차지 * ''KO16MSWIN949'' : CP949, 모든 한글 표현, 한글 2bytes 차지 * ''AL32UTF8'' : UTF-8, 한글 3bytes 차지 * 참고 * [[https://db.necoaki.net/134|db.necoaki.net :: Oracle Character set 에 관하여]] 문자셋 그 자체에 대한 설명 * [[https://rocksea.tistory.com/241|[Oracle] Character set 변경.]] * [[https://jehna.tistory.com/34|[Oracle] 문자셋(characterset) 확인 및 변경 :: Jehna :)]] ===== TIMEZONE ===== * [[https://www.carajandb.com/en/blog/2016/be-careful-when-setting-the-dbtimezone/|Be careful when setting the DBTIMEZONE! | CarajanDB]] * [[https://www.oracletutorial.com/oracle-date-functions/oracle-dbtimezone/|Oracle DBTIMEZONE]] ===== 권한 Grant ===== * [[https://hello-nanam.tistory.com/1|나남나여 :: 오라클 테이블 권한 부여 ( GRANT )]] * [[https://m.blog.naver.com/PostView.nhn?blogId=heartflow89&logNo=221002112762&proxyReferer=https:%2F%2Fwww.google.com%2F|[Oracle/오라클] 권한 부여(GRANT) / 제거(REVOKE) / 조회 / 계정(사용자) 생성 : 네이버 블로그]] * [[https://jink1982.tistory.com/34|[Oracle] 권한 생성(GRANT), 권한 삭제(REVOKE) :: 돼민이]] * [[http://develop.sunshiny.co.kr/736|Oracle - 디폴트 롤, DBA, CONNECT, RESOURCE :: You've got to find what you love.]] ==== 기본 Role ==== * ''CONNECT'' : DB 접속 권한 * ''RESOURCE'' : 객체(생성, 수정, 삭제), 데이터(입력, 수정, 조회, 삭제) 권한 * ''DBA'' : 절대 권력? ==== Table 단위 권한 부여 ==== -- 부여 GRANT SELECT, INSERT, DELETE, UPDATE ON [TABLE NAME] TO [USER]; -- 해제 REVOKE SELECT, INSERT, DELETE, UPDATE ON [TABLE NAME] FROM [USER]; ===== Identifier too long ===== * ''ORA-00972: identifier is too long(Oracle 데이터베이스 오류 972: ORA-00972: 식별자가 너무 깁니다)'' * 컬럼명, 테이블명 등의 식별자 길이는 **30byte**로 제한돼 있다. * 한글 컬럼명 등의 경우 인코딩에따라 ''UTF-8''은 한 글자가 3byte 혹은 ''CP949'' 일 경우에는 2byte를 차지하기 때문에 생각보다 길어지게 된다. * JPA/Hibernate 에서 발생한다면 [[java:hibernate:dialect|Hibernate Dialect]] alias 참조