난 과연 잘하고 있는걸까??



iPhone 에서 작성된 글입니다.
#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 (*ptr)[3]과 int* arr[3]의 차이점은 무엇인가? 

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 값 포인터에 의해서 읽혀지는 값을 변경할 수 없다.
그러나 주소 변경은 가능하다. 

const int *pa = int const *pa =  const int* pa

다 같은 표현인 것이다.  

int* const p 는 다르다. 값의 변경은 가능하지만 포인터값의 p의 주소값을 수정할 수 없다.  

 
갑자기 디비 접속이 안 된다고 난리이다.

처음보는 에러이고 리스너 문제도 아니고 디비가 꺼진 것도 아니다.

검색 결과 아카이브모드로 오라클이 운영 중일 때 생기는 에러!! (일반적 설치시 비아카이브 모드)

SYS계정으로 쿼리를 날려보자 만약 sys로 접속이 된다면.. 

select * from v$recovery_file_dest


 
Name : 백업파일 위치 
space_limit : 백업저장공간 (기본 4G)
space_used : 사용공간

중요한 것은 사용공간이 백업저장공간을 가득 채울 때 나타난다. 

용량 추가 백업저장공간(SPACE_LIMIT)를 10기가로 늘려준다.

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; 
물리적으로 존재하지 않는 논리적 파일들을 정리해준다. 

다시 접속하고 용량을 확인해보자 항상 위기 탈출만.. ㅋㅋㅋㅋ

 




 
테이블과컬럼 
    
SELECT A.TABLE_NAME
           , 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
ON A.TABLE_NAME = B.TABLE_NAME
AND A.COLUMN_NAME = B.COLUMN_NAME
WHERE A.OWNER = 'SWING';

인덱스보기               
              
 SELECT a.table_name, a.index_name, uniqueness, column_name
  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보기

SELECT a.table_name, a.constraint_name, b.column_name
  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 * FROM(
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;

전체적으로 통계를 보고 느린 쿼리만 집중 튜닝한다. 아마 운영 중에나 가능할 것 같다.

SELECT
           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 명령어

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)

+ Recent posts