분류 전체보기
- 문득 2011.07.24
- 문자열 상수 2011.07.24
- 포인터 배열과 배열 포인터의 차이점 2011.07.23
- Const 키워드 2011.07.23
- Oracle ORA-00257 에러 2011.07.22
- 오라클 컬럼정리 2011.07.13
- 오라클 느린 쿼리 보기 2011.07.13
- FTP 명령어 2011.07.11
문득
문자열 상수
#include<stdio.h> #include<stdlib.h> #include<string.h> void main() { char* ptr1; char* ptr2 = "korea"; char* ptr3 = NULL; ptr3 = (char *)malloc(sizeof(char)*20); //strcpy(ptr1, "Good Korea"); //warning 초기화하지 않고 씀 //strcpy(ptr2, "Good Korea"); //warning 이미 korea가 할당되어 korea가 상수이므로 //korea를 수정할 수 없음 문자열 상수 strcpy(ptr3, "Good Korea"); printf("%s\n", ptr3); free(ptr3); }
ptr2 는 "korea"가 이미 할당되어 문자열 상수를 가르키는 포인터가 된다.
문자열 상수는 내용을 고칠 수 없으므로 사용할 수 없다.
하지만
ptr2 = "hi korea";
로 바꿀 수는 있다.
포인터 배열과 배열 포인터의 차이점
int* arr[3] 은 포인터 배열이다.
변수명 | 저장하는 내용 |
arr[0] | int* |
arr[1] | int* |
arr[2] | int* |
int (*ptr)[3]은 배열 포인터이다.
int a[2][3] | ||
a[0][0] | a[0][1] | a[0][2] |
a[1][0] | a[1][1] | a[1][2] |
int a[2][3] = {{3,4,5}, {6,7,8}};
int (*ptr)[3];
ptr=a; 로 대입할 수 있다.
포인터 배열은 포인터를 가지고 있는 배열이며 배열 포인터는 배열을 가르키는 포인터이다.
즉 끝의 단어로 포인터 배열 = 배열, 배열 포인터=포인터 이다.
Const 키워드
즉 Const로 선언된 변수는 수정할 수 없다.
포인터와 const 키워드
#include<stdio.h> void main() { int a = 10; int b = 20; const int *pa = &a; //*pa = 20; //값을 변경할 수 없다. (Error) pa = &b; //주소 변경 가능 int const *pb = &b; pb = &a; int* const p = &a; *p = 30; }위에서 보면 const int *pa와 int const *pb은 같은 내용이다.
즉 *pb 값 포인터에 의해서 읽혀지는 값을 변경할 수 없다.
그러나 주소 변경은 가능하다.
다 같은 표현인 것이다.
int* const p 는 다르다. 값의 변경은 가능하지만 포인터값의 p의 주소값을 수정할 수 없다.
Oracle ORA-00257 에러
처음보는 에러이고 리스너 문제도 아니고 디비가 꺼진 것도 아니다.
검색 결과 아카이브모드로 오라클이 운영 중일 때 생기는 에러!! (일반적 설치시 비아카이브 모드)
SYS계정으로 쿼리를 날려보자 만약 sys로 접속이 된다면..
select * from v$recovery_file_dest
Name : 백업파일 위치
space_limit : 백업저장공간 (기본 4G)
space_used : 사용공간
중요한 것은 사용공간이 백업저장공간을 가득 채울 때 나타난다.
alter system set db_recovery_file_dest_size = 10G;
용량추가로 잠시 살아 날 수 있다.^^
만약 SYS계정으로 접속이 불가능하다면...
검색해보면 RMAN을 이용해서 지우라고 하는데 사용법이 엄청 낯설다.. 이게 무슨 개소리야. .
RMAN으로 접속 오라클 계정으로 접속하자.
>su - oracle
>rman target /
expired 된 파일들을 지우는 명령
RMAN>DELETE OBSOLETE;
하지만 난 만료된 파일이 없다.... 쩝..
백업 파일의 위치에 가서 지난 날짜에 대해서 백업파일을 지워주면 된다.
위치 ~~ /flash_recovery_area/~~/archivelog 밑에 날짜별로 쌓여있다.
지난 날짜를 지우고 접속이 되는지 확인해 보았다.
접속이 안된다면 아마도 물리적공간을 지웠지만 논리적으로 남아 있어 접속 불가...
RMAN 사용법을 잘 모른다. 하지만 RMAN으로 접속
RMAN>list copy;
백업 파일 리스트가 나온다.
RMAN>DELETE NOPROMPT EXPIRED COPY;
물리적으로 존재하지 않는 논리적 파일들을 정리해준다.
다시 접속하고 용량을 확인해보자 항상 위기 탈출만.. ㅋㅋㅋㅋ
오라클 컬럼정리
, A.COLUMN_NAME
, A.DATA_TYPE
, A.DATA_LENGTH
, A.DATA_DEFAULT
, A.NULLABLE
, B.COMMENTS
FROM ALL_TAB_COLUMNS A
LEFT OUTER JOIN ALL_COL_COMMENTS B
AND A.COLUMN_NAME = B.COLUMN_NAME
WHERE A.OWNER = 'SWING';
인덱스보기
FROM all_indexes a, all_ind_columns b
WHERE a.table_name = b.table_name
AND a.index_name = b.index_name
AND a.OWNER = 'SWING'
ORDER BY a.table_name, b.column_position;
PK보기
FROM all_constraints a, ALL_CONS_COLUMNS b
WHERE a.constraint_name = b.constraint_name
AND a.constraint_type = 'P'
AND a.OWNER = 'SWING'
오라클 느린 쿼리 보기
sys 계정으로 들어가서 느린 쿼리를 골라 낸다.
SELECT ROUND(ELAPSED_TIME/EXECUTIONS/1000000,3) AS ELAPSED_TIME
, LAST_ACTIVE_TIME
, SQL_TEXT
FROM V$SQL
WHERE parsing_schema_name = 'SWING'
AND LAST_ACTIVE_TIME >= TO_DATE('20110706', 'YYYYMMDD')
)
WHERE ELAPSED_TIME > 5
order by LAST_ACTIVE_TIME desc;
전체적으로 통계를 보고 느린 쿼리만 집중 튜닝한다. 아마 운영 중에나 가능할 것 같다.
COUNT(*) AS SQL개수
, COUNT(DISTINCT SUBSTR(SQL_TEXT, 1 , 100)) AS SQL유니크개수
, SUM(EXECUTIONS) AS 수행횟수
, ROUND(AVG(ELAPSED_TIME/EXECUTIONS/ 1000000), 2) AS 평균수행시간
, COUNT(CASE WHEN ELAPSED_TIME/EXECUTIONS/1000000 >= 10 THEN 1 END) AS 악성10초이상쿼리
, ROUND(MAX(ELAPSED_TIME/EXECUTIONS/1000000), 2) AS 최대소요시간
FROM V$SQL
WHERE PARSING_SCHEMA_NAME = 'SWING'
AND LAST_ACTIVE_TIME >= TO_DATE('20110706', 'YYYYMMDD')
FTP 명령어
ftp 명령어
binary : 전송모드를 BINARY모드로 설정한다.( bin)
bye : ftp접속을 종료하고 빠져나간다.(bye)
cd : remote시스템의 디렉토리를 변경한다.(cd 디렉토리명)
cdup : remote시스템에서 한단계 상위디렉토리로 이동한다.(cdup)
delete : remote시스템의 파일을 삭제한다.(delete index.old)
dir : remote시스템의 디렉토리 내용을 디스플레이한다.(dir)
disconnect : ftp접속을 종료한다.(disconnect)
exit : ftp접속을 종료하고 빠져나간다.(exit)
get : 지정된 파일하나를 가져온다.(get index.html)
hash : 파일전송 도중에 "#"표시를 하여 전송중임을 나타낸다.(hash)
help : ftp명령어 도움말을 볼 수 있다.(help또는 help 명령어)
lcd : local시스템의 디렉토리를 변경한다.(lcd 디렉토리명)
ls : remote시스템의 디렉토리 내용을 디스플레이한다. (ls 또는 ls -l)
mdelete : 여러개의 파일을 한꺼번에 지울 때 사용한다.( mdelete *.old)
mget : 여러개의 파일을 한꺼번에 가져오려할 때 사용한다. ( mget *.gz)
mput : 한꺼번에 여러개의 파일을 remote시스템에 올린다.(mput *.html)
prompt : 파일전송시에 확인과정을 거친다. on/off 토글 (prompt)
put : 하나의 파일을 remote시스템에 올린다.(put index.html)
pwd : remote시스템의 현재 작업디렉토리를 표시한다.(pwd)
quit : ftp접속을 종료하고 빠져나간다.(quit)
rename : remote시스템의 파일명을 바꾼다.(remote 현재파일명 바꿀파일명)
rmdir : remote시스템의 디렉토리을 삭제한다.(rmdir 디렉토리명)
size : remote시스템에 있는 파일의 크기를 byte단위로 표시한다.(size index.html)
status : 현재 연결된 ftp세션모드에 대한 설정을 보여준다.(status)
type : 전송모드를 설정한다.(type 또는 type ascii 또는 type binary)