히스토그램 

테이블의 열값이 어떻게 분포되어 있는지 확인하는 통계정보입니다. 

MySQL

생성

ANALYZE TABLE 테이블명 UPDATE HISTOGRAM ON 열명 나열;

조회

SELECT * FROM INFORMATION_SCHEMA.COLUMN_STATISTICS;

MariaDB

생성

ANALYZE TABLE 테이블명 PERSISTENT FOR COLUMNS (열명 나열) INDEXES();

조회 

SELECT * FROM mysql.column_stats;
갑자기 디비 접속이 안 된다고 난리이다.

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

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

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')





>su - oracle
>sqlplus '/as sysdba'
SQL> startup

SQL>shutdown immediate


lsnrctl start 리스너명(명이 있을때).
lsnrctl stop 리스너명(명이 있을때).



1. 우선 있을지 모르는 오류를 대비해 설정파일을 백업합니다.

$sudo cp /etc/mysql/my.cnf /etc/mysql/my.cnf.orig

2. my.cnf 파일을 다음과 같이 편집해줍니다.(각 항목에 추가만 해주시면 됩니다.)

[client]
default-character-set=utf8

[mysqld]
character-set-client-handshake=FALSE
init_connect="SET collation_connection = utf8_general_ci"
init_connect="SET NAMES utf8"
default-character-set=utf8
character-set-server=utf8
collation-server=utf8_general_ci

[mysqldump]
default-character-set=utf8

[mysql]
default-character-set=utf8


3. mysql을 재시작해줍니다.
$sudo /etc/init.d/mysql restart

4. 변경이 되었는지 여부를 확인합니다.
$mysql -u id -p
mysql> status

1.데이터 베이스 접속하기
mysql -u 사용자명 -p 데이터베이스이름
mysql -u root (계정과 비번을 만들지 않았을때)
mysql -u root -p(루트 비번이 있을때)

2.데이터베이스 추가 
mysqladmin -u root -p create 데이터베이스명

3.루트 계정비밀번호 바꾸기
mysqladmin -u root -p password 새비밀번호
mysqladmin -u root password 비밀번호(비밀번호를 처음 설정시)

4.사용자추가 및 권한 설정
사용자계정:abc , 사용자 패스워드:1234

접속 : mysql -u root -p

mysql> USE mysql;

mysql> INSERT INTO user (Host, User, Password) VALUES ('localhost', '계정아이디', password('비밀번호'));
mysql> INSERT INTO user (Host, User, Password) VALUES ('%', '계정아이디', password('비밀번호'));
mysql> FLUSH privileges;

계정이 생성되었다면, 그 계정이 접근할 수 있는 데이터베이스를 생성하고 권한을 부여해야 합니다.

mysql> CREATE DATABASE 데이터베이스명;
mysql> GRANT ALL privileges ON 데이터베이스명.* TO 계정아이디@locahost IDENTIFIED BY '비밀번호';
mysql> GRANT ALL privileges ON 데이터베이스명.* TO 계정아이디@'%' IDENTIFIED BY '비밀번호';

5.테이블 생성
create table test;

6.테이블 삭제
drop table test;

7.현재상태보기
status;

8.테이블목록보기
show tables;

9.데이터베이스 목록보기
show databases;

10.테이블구조보기 
explain tablesname;

11.데이터베이스 삭제 
drop database jsp

*체크*

우선, 기본적으로 mysql 은 tcp 3306 번 포트를 통해 서비스를 제공합니다.

따라서, 외부에서 DB에 접근할 수 있도록 하기 위해서는

서버의 tcp 3306 번 포트가 방화벽에 막혀 있지는 않은지 확인해야 하며

만약 막혀 있을 경우 열어주어야 합니다.

iptables -L 명령으로 차단/허용 리스트 조회가 가능합니다. 만약 포트가 막혀 있을 경우,

# iptables -I INPUT -p tcp --dport 3306 -j ACCEPT

명령으로 열어주시면 됩니다.

  

+ Recent posts