728x90

PostgreSQL에서 replica identity는 Logical Replication 또는 Change Data Capture (CDC)를 사용할 때 중요합니다.

replica identity가 설정되지 않으면 DELETE 작업을 포함한 일부 작업이 실패하게 됩니다. 오류 메시지가 말하는 바는 다음과 같습니다.

원인

  • Replica Identity 미설정: 테이블이 복제 식별자가 설정되지 않았기 때문에, PostgreSQL은 DELETE 요청을 처리할 수 없습니다. PostgreSQL의 기본 설정은 replica identity가 없는 테이블에서 DELETE 작업을 지원하지 않으며, 이는 데이터 변경 사항이 소비자에게 올바르게 전달될 수 없도록 합니다.

해결 방법

cdc_table에 대한 replica identity를 설정하여 이 문제를 해결할 수 있습니다. PostgreSQL에서는 다음과 같은 방법으로 설정할 수 있습니다:

  1. REPLICA IDENTITY 설정: 다음 SQL 명령어를 사용하여 cdc_table의 replica identity를 설정합니다.
    • FULL: 전체 행의 데이터를 복제하는 설정입니다. 이 방법은 DELETE 요청을 포함한 모든 변경 사항을 처리할 수 있게 합니다.
    • USING INDEX <index_name>: 특정 인덱스를 사용하여 복제 식별자를 설정할 수도 있습니다. 이 경우 인덱스가 필요합니다.
  2.  
    코드 복사
    ALTER TABLE public.cdc_table REPLICA IDENTITY FULL;
  3. sql
  4. REPLICA IDENTITY 상태 확인: 테이블의 현재 replica identity 상태를 확인하려면 다음 쿼리를 사용할 수 있습니다.
    • relreplident의 값이 d인 경우 (d는 'default'를 의미) 설정이 되어 있지 않은 것입니다. f는 full 설정을, i는 인덱스 기반 복제를 의미합니다.
  5. sql
    코드 복사
    SELECT relname, relreplident FROM pg_class WHERE relname = 'cdc_table';
  6. 변경 사항 확인: REPLICA IDENTITY 설정 후, DELETE 작업을 다시 시도하여 문제가 해결되었는지 확인합니다.
728x90

Postgresql 의 CDC 관리를 위해 Postgresql 설정 변경 하는 법 !

 

 

1. wal 상태 변경 (default : minimal)

Write-Ahead Logging (WAL) - Database의 변경 사항을 기록하는 로그
: 얼마나 많은 정보를 기록할지를 결정하는 설정입니다. 이 옵션은 데이터 복구, 복제, 또는 Change Data Capture(CDC) 등의 기능을 위해 중요한 역할을 합니다.

postgresql.conf

 

1. minimal

  • 설명: 최소한의 WAL 로그만 기록합니다. 주로 데이터베이스의 성능을 극대화하기 위한 용도로 사용됩니다.
  • 용도: 데이터베이스 복구만을 목표로 하고, **복제나 PITR(시점 복구)**를 사용하지 않을 경우에 적합합니다.
  • 제한사항: 이 설정은 복제(replication)나 **백업에서 시점 복구(PITR)**를 할 수 없습니다.

2. replica

  • 설명: WAL 로그에 데이터 복구와 복제(replication)를 위한 정보를 추가로 기록합니다.
  • 용도: 동기식 또는 비동기식 복제를 사용할 때 적합하며, 데이터베이스 복구와 **백업에서 시점 복구(PITR)**를 지원합니다.
  • 특징: 대부분의 기본적인 복제 시스템에서 사용되는 옵션입니다.

3. logical

  • 설명: replica에서 기록하는 정보에 더해, 논리적 복제와 **Change Data Capture (CDC)**에 필요한 추가 정보를 기록합니다.
  • 용도: 테이블 데이터의 변경 사항을 논리적 복제Kafka와 같은 스트리밍 시스템으로 전송하고 싶을 때 설정합니다. 주로 CDC 작업을 위해 사용됩니다.
  • 특징: 이 설정은 테이블의 구조 및 행 단위의 변경 사항을 추적할 수 있으며, 이를 통해 외부 시스템과의 연동이 가능합니다.

 

 

 

 

 

 

 

2. pgoutput 변경

postgresql.conf

 

PostgreSQL의 WAL을 기록하는 로그인데, WAL은 텍스트가 아닌 바이너리 형식으로 저장됨.

wal 데이터 중 일부.

하여 이 파일을 읽기 위해 다양한 디코더를 제공하는데, 이 디코더는 WAL 파일의 형식을 이해하고, 필요한 정보를 추출하여 논리적 형식으로 변환함. 

 

 

(1) pgoutput

  • 정의: pgoutput은 PostgreSQL의 논리적 복제에서 사용되는 기본 디코더입니다. 이 디코더는 WAL의 변경 사항을 논리적 데이터 변경 이벤트로 변환합니다.
  • 특징:
    • 논리적 복제: pgoutput은 기본적으로 PostgreSQL의 논리적 복제를 지원합니다. 이를 통해 사용자는 데이터를 복제하는 다른 서버에 데이터를 전송할 수 있습니다.
    • 변경 사항 표현: 데이터 변경(INSERT, UPDATE, DELETE) 시 각각의 변경 사항을 명확하게 식별하여 출력합니다.
    • 유연성: 여러 테이블과 필드를 포함한 복제 및 구독을 설정할 수 있어 유연한 데이터 복제 환경을 제공합니다.
  • 용도: 주로 Debezium과 같은 CDC(변경 데이터 캡처) 도구에서 사용하여 데이터베이스의 변경 사항을 Kafka와 같은 메시징 시스템으로 전송할 때 활용됩니다.

(2) decoderbufs

  • 정의: decoderbufs는 PostgreSQL의 논리적 복제에 사용되는 또 다른 디코더입니다. 이 디코더는 데이터를 보다 효율적으로 압축하여 처리할 수 있는 기능을 제공합니다.
  • 특징:
    • 압축된 형식: decoderbufs는 변경 사항을 보다 압축된 형식으로 출력하므로 데이터 전송량을 줄이고 성능을 향상시킬 수 있습니다.
    • 모든 변경 사항 기록: 이 디코더는 INSERT, UPDATE, DELETE를 포함하여 모든 데이터 변경 사항을 기록합니다.
    • 전문가용: decoderbufs는 주로 성능이 중요한 대규모 데이터베이스 환경에서 사용됩니다.
  • 용도: 고속 데이터 전송이 필요한 상황에서 사용되며, Debezium과 같은 CDC 도구와 함께 사용할 수 있습니다.

요약

  • pgoutput: PostgreSQL의 기본 디코더로, 논리적 복제를 지원하며 데이터 변경을 명확하게 출력.
  • decoderbufs: 압축된 형식으로 데이터를 전송하여 성능을 향상시키는 디코더로, 고속 데이터 전송이 필요한 경우에 적합.

 

 

 

 

3. Postgresql 재시작

 

 

 

- 변경사항 확인 

 

 

 

 

 

728x90

1. 첫번째 오류

https://yjshin.tistory.com/744

 

[Linux] Ubuntu root 권한이 없는 경우, is not in the sudoers file. This incident will be reported.

[username] is not in the sudoers file. This incident will be reported. 우분투에서 sudo 명령어 작성시 root 권한이 없을 때 발생하는 오류 문구 입니다. 해결 방법은 sudoers 파일에 계정 이름을 넣어 root 권한을 부여

yjshin.tistory.com

 

 

 

2. 두번째 오류

 

 

원인 파악을 위해 로그파일 확인!

 

 

 

 

pg_hba.conf 파일에 오류가 있음을 확인했다. 

 

 

위 파일에서 

#local   replication     all

 

 

이 부분 주석처리. 

 

 

728x90

<DATABASE>

 

db 접속 :  mysql -u계정 -p비밀번호 데이터베이스명

  - C:₩> mysql -ukdhong –p1234 kdhong_db

 

 

 

db 생성 : create database 데이터베이스명;

 -  mysql> create database sample1;

 

 

 

db 목록 보기 : show databases;

   -  mysql> show databases;

 

 

 

db 삭제 :  drop database 데이터베이스명;

  -  mysql> drop database sample1; 

 

 


 

 

 

<TABLE>

 

 

 

테이블 생성 명령 : mysql> create table 테이블명( 필드명1 타입, 필드명2 타입, 필드명3 타입, ........... PRIMARY KEY(필                                                                                                                                         드명) );

            mysql> create table friend ( -> num int not null, -> name char(10), -> address char(80), -> tel char(20), ->               email char(20), -> primary key(num) -> );

 

 

 

 

테이블 필드 구조 확인 : desc 테이블명;

                      mysql> desc friend;

 

 

 

 

새로운 필드 추가 명령 : alter table 테이블명 add 새로운 필드명 필드타입 [first 또는 after 필드명];

  ex)friend 테이블 나이 필드를 정수형으로 추가

  1. mysql> alter table friend add age int;

  2. mysql> desc friend; (확인)

 

 

 

 

필드 삭제 : alter table 테이블명 drop 삭제할 필드명1, 삭제할 필드명2;

  ex) friend 테이블에서 email과 age 필드 삭제

  1. mysql> alter table friend drop email;

  2. mysql> alter table friend drop age;

 

 

 

필드 수정 : alter table 테이블명 change 이전 필드명 새로운 필드명 필드 타입;

   ex) friend 테이블 필드 중 tel char(20)을 phone int로 변경 

   mysql> alter table friend change tel phone int;

 

 

 

 

필드 타입 수정 명령 : alter table 테이블명 modify 필드명 새로운 타입;

  ex) name 필드의 타입을 int로 변경

   mysql> alter table friend modify name int;

 

 

 

 

 

테이블명 수정 명령 : alter table 이전 테이블명 rename 새로운 테이블명;

  ex) 테이블명 friend에서 student로 변경

  mysql> alter table friend rename student;

 

 

 

 

테이블 삭제 : drop table 테이블명;

 

 

 

 


 

 

 

 

<RECORD>

 

 

특정 문자열이 포함된 레코드 검색 명령 : select 필드명1, 필드명2, from 테이블명 where 검색 필드 like 조건식;

  ex) 성이 김씨인 사람의 이름, 주소, 전화번호 보기

  mysql> select name, address, tel from mem where -> name like '김%';

 

 

 

레코드 정렬 명령 : select 필드명1, 필드명2 from 테이블 명 order by 필드명;

   ex) 나이순 정렬, age, id, name, tel 필드 검색 

   오름차순 정렬 명령 mysql> select age, id, name, sex, tel from mem -> order by age;

   내림차순 정렬 명령 mysql> select age, name, address from mem -> where address like '서울%' order by age desc;

 

 

 

레코드 수정 명령 : update 테이블명 set 필드명=필드값 [where 조건식]

 ex) mem 테이블에서 아이디가 yjhwang인 레코드의 전화번호를 123-4567로 변경

 1. mysql> update mem set tel='123-4567' where id='yjhwang';

 2. mysql> select id, name, tel from mem where id='yjhwang';

 

 

 

레코드 삭제 명령 : delete from 테이블명 where 조건식

 

 

 

데이터베이스 백업 명령 : mysqldump -u계정 -p비밀번호 데이터베이스명 > 백업파일명

  ex) kdhong 계정의 kdhong_db 를 kdhong_db.sql에 백업 

  C:₩kdhong> mysqldump -ukdhong -p1234 kdhong_db -> kdhong_db.sql

 

 

백업 파일 복원 : mysql -u계정 -p비밀번호 데이터베이스명 < 백업 파일명

 ex) kdhong_db.sql을 다른 사용자 계정에 복원 

   계정 : kim, 비밀번호 : 1234, 데이터베이스명 : kim_db 

   C:₩kdhong>mysql -ukim -p1234 kim_db < kdhong_db.sql

 

 

 

 

 

 


 

 

 

 

 

<FUNCTION>

 

1. mysql_connect()

 

php 와 Mysql 을 연결 . (C:\>mysql -ukdhong -p1234’와 같은 기능)

 

 

 

2. mysql_select_db()

 

사용할 데이터베이스를 선택. ( ‘mysql>use kdhong_db;’와 같은 명령 )

 

 

 

 

3. mysql_query()

 

함수의 인자에 있는 sql 명령을 실행. 

 

 

 

 

4. mysql_close()

 

mysql과의 연결 종료

 

 

 

 

5. mysql_fetch_array()

 

데이터베이스에서 레코드의 데이터를 배열 형태로 가져온다.

가져온 데이터는 $row[num], $row[id]와 같이 레코드의 필드명을 배열 인덱스에 직접 입력한 형태로 사용한다.

 
ex for 문에서의 어레이함수. 위에서 select * 로 한 열(가로)을 지정해 줬을때, for 문을 돌리면
mysql_fetch_array[0] -> 첫번째 행 (세로)
mysql_fetch_array[0] -> 두번째 행
mysql_fetch_array[0] -> 세번째 행

 반복되는게 곧 행의 변경.

 

6. mysql_fetch_row()

 

데이터베이스에서 레코드의 데이터를 배열 형태로 가져온다.

array mysql_fetch_array() 함수와 동일한 기능을 수행하지만, 가져온 데이터는 레코 드의 필드 번호를 배열 인덱스에 입력한 $row[1], $row[$i]와 같은 형태로 사용하는 점 이 다르다.

 

 

 

7. mixed mysql_result(resource result, int row, mixed field)

   - 첫 번째 인자: 식별자 번호(mysql_query()의 반환값)

   - 두 번째 인자: 레코드의 행 위치

   - 세 번째 인자: 레코드의 열 위치

 

레코드의 특정 위치에 저장된 값을 가져온다.

mysql_fetch_row()와 mysql_fetch_array() 함수가 하나의 레코드 정보를 가져오는 반 면,

mysql_result() 함수는 특정 위치에 해당하는 값을 가져온다.

세 번째 인자에는 필 드의 일련번호(0부터 시작)와 필드명을 모두 사용할 수 있고,

반환값의 형태에 따라 반 환값의 타입이 달라진다.

 

 

8 .mysql_num_fields()

형식> int mysql_num_fields(resource result)

인자의 필드 개수를 알려준다.

 이중포문에서 필드의 갯수까지만 돌리도록 설계할 때 사용했음.

 

 

9. mysql_num_rows()

레코드의 개수를 알려준다.

728x90

** 여기서는 mysql 함수, html, php 문법들이 마구마구 나오는 실습정리 글입니다. 피드백은 언제나 환영입니다.

 

 

이걸 진행하기 전에 1. kdhong 계정을 생성하고, 2. kdhong_db 데이터베이스를 생성, 3. stud_score 테이블을 생성했습니다. 자세한 방법은 mysql 카테고리에 나와있습니다.

 

 

결과물)

(예시를 위해 '이유진' 의 성적을 입력해놓은 상태입니다! )

 

 

목차) 

1. php , mysql 연동

2. php 순위 매기기

3. 웹페이지 만들기

 

 

 

<?
 $con = mysql_connect("localhost","kdhong","1234");

mysql_select_db("kdhong_db",$con);

<?  : php문 시작

1. mysql_connect : PHP와 MySQL을 연결한다.  ‘C:\>mysql -ukdhong -p1234’와 같은 기능.

 

mysql_select_db : 사용할 데이터베이스를 선택 ‘mysql>use kdhong_db;’와 같은 명령이다.

 

 

 

 

if ($mode=="insert"){
    
    $sum = $sub1+$sub2+$sub3+$sub4+$sub5;
    $avg = $sum/5;
    
    $sql = "insert into stud_score (name, sub1, sub2, sub3, sub4, sub5, sum, avg) values ('$name','$sub1','$sub2','$sub3','$sub4','$sub5','$sum','$avg')";
    
    $result = mysql_query($sql, $con);

밑에서 웹 설계하는 과정의 <form ~ 문에서 mode=insert 일 때, 밑에 문을 실행합니다.

성적 입력 후 '입력하기' 버튼을 누르면 stud_score 이라는 테이블에 입력값을 저장합니다.

 

mysql_query($a,$b) : 함수의 인자에 있는 SQL 명령을 실행합니다.

 

 

 

 

 

 

<meta charset="euc-kr">
    <title>성적입력기</title>

    <h2>1) 성적 입력하기</h2>
    <form name="stud_score" method="post" action="score_list.php?mode=insert">
    <table width="720" border="1" cellpadding="5"><tr>
    
    <td>이름 :<input size="6" name="name"type="text"></td>
     <td>과목1 :<input size="6" name="sub1"type="text"></td>
    <td>과목2 :<input size="6"name="sub2"type="text"></td>
    <td>과목3 :<input size="6" name="sub3"type="text"></td>
    <td>과목4 :<input size="6" name="sub4"type="text"></td>
    <td>과목5 :<input size="6" name="sub5"type="text"></td>
    <td><input  type="submit" value="입력하기"></td></tr></table></form>
    

meta charset ~ : 태그는 html 파일의 인코딩을 알려주는 태그입니다. 인코딩을 명확하게 알려주지 않으면 웹브라우저 설정 상황에 따라 자동으로 인코딩을 추정해서 처리해주는데, 처리가 정확할 경우도 있지만, 그렇지 못하는 경우도 많습니다. 다양한 경우에 한글이 깨지지 않고 잘 보이기를 기대한다면 위 태그는 꼭 적어주는 것이 좋습니다.

 

 

 

<p><h2>2) 성적 출력 하기</h2>
        <p> <a href="score_list.php?mode=big_first">[성적순 정렬]</a>
     <a href ="score_list.php?mode=small_first">[성적역순 정렬]</a><p>

성적 출력 제목을 넣어줍니다.

<a href ~> mode=big_first 가장 큰 성적순으로 나열하는 로직을 첨부합니다.

mode=small_first 역순으로 나열하는 로직을 첨부합니다.

 

 

 

 

<table width="720" border="1" cellpadding="5">
<tr align="center" bgcolor="#eeeeee">
<td>번호</td>
<td>이름</td>
<td>과목1</td>
<td>과목2</td>
<td>과목3</td>
<td>과목4</td>
<td>과목5</td>
<td>합계</td>
<td>평균</td>
<td>순위</td>
<td>&nbsp;</td>
    </tr>

두번째 테이블을 만들어줍니다. 위에 나와있는 것 중 자세한 설명은 html 카테고리 글에 자세히 나와있습니다.

 

 

 

 

 

 

<?

if ($mode =="big_first")
    $sql = "select * from stud_score order by sum desc";
    elseif ($mode =="small_first")
        $sql = "select * from stud_score order by sum";
        else
            $sql = "select * from stud_score";
    

$result = mysql_query($sql);

 

 

 

 

for($count=1; $count<=mysql_num_rows($result);$count++){
    $row = mysql_fetch_array($result);
     $avg = round($row[avg], 1);
     $num = $row[num];

 

 

 

 

 

echo ("<tr align='center'>
<td> $count </td>
<td> $row[name] </td>
<td> $row[sub1] </td>
 <td> $row[sub2] </td>
 <td> $row[sub3] </td>
<td> $row[sub4] </td>
 <td> $row[sub5] </td>
 <td> $row[sum] </td>
 <td> $avg </td>
 <td> $row[rank]</td>
<td> <a href='score_delete.php?num=$num'>[삭제]</a></td>
</tr>");
}

mysql_close();
?>


</table>

 

728x90
mysql> desc friend;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| num   | int(11)  |      | PRI | 0       |       |
| name  | char(10) | YES  |     | NULL    |       |
| adr   | char(80) | YES  |     | NULL    |       |
| tel   | char(20) | YES  |     | NULL    |       |
| email | char(20) | YES  |     | NULL    |       |
| age   | int(11)  | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+
6 rows in set (0.00 sec)​

desc로 테이블을 참조해줍니다. (확인)

근데?

mysql> insert into friend values (1,'김','인천','34343',22);
ERROR 1136: Column count doesn't match value count at row 1

추가하려는데 추가가 안되는거에요. ㅠ 전 무엇을 잘못한걸까요?

 

 

 

 

 

 

필드가 6개 있는데 추가하는 필드는 5개죠. 즉 이메일의 값을 더 넣던가 아니면 필드에서 이메일을 지워야 합니다.

 

 

필드를 지우는 것이니 alter, drop email 을 써서 지워줍니다.

mysql> alter table friend drop email;
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc friend;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| num   | int(11)  |      | PRI | 0       |       |
| name  | char(10) | YES  |     | NULL    |       |
| adr   | char(80) | YES  |     | NULL    |       |
| tel   | char(20) | YES  |     | NULL    |       |
| age   | int(11)  | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+
5 rows in set (0.01 sec)

지워진 것을 확인하고 위의 값을 다시 넣어줍니다. 

 

 

 

 

 

 

mysql> desc friend;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| num   | int(11)  |      | PRI | 0       |       |
| name  | char(10) | YES  |     | NULL    |       |
| adr   | char(80) | YES  |     | NULL    |       |
| tel   | char(20) | YES  |     | NULL    |       |
| age   | int(11)  | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+
5 rows in set (0.00 sec)

 

----------------------------------------------------------------------------------------------------------------------------------

(다른 테이블입니다)

 

mysql> desc student;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| num   | int(11)  |      | PRI | 0       |       |
| name  | char(10) | YES  |     | NULL    |       |
| adr   | char(40) | YES  |     | NULL    |       |
| tel   | char(20) | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+
4 rows in set (0.00 sec)

desc 로 테이블을 참조해줍니다.

 

 

age필드를 추가해 보겠습니다. 

mysql> alter table student add age int after name;
Query OK, 2 rows affected (0.05 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> desc student;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| num   | int(11)  |      | PRI | 0       |       |
| name  | char(10) | YES  |     | NULL    |       |
| age   | int(11)  | YES  |     | NULL    |       |
| adr   | char(40) | YES  |     | NULL    |       |
| tel   | char(20) | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+
5 rows in set (0.01 sec)

위에서 실습 한 것처럼 table이니 alter를 사용해주고, name 밑 공간에 age 를 추가하기 위해 after name; 을 마지막에 써줍니다.

위의 코드와 지금 desc 코드를 비교하니 age 필드가 추가된 것을 확인할 수 있습니다. 

 

 

mysql> select * from student;
+-----+--------+------+---------------+---------+
| num | name   | age  | adr           | tel     |
+-----+--------+------+---------------+---------+
|   1 | 이유진 | NULL | 경기도 수원시 | 031-419 |
|   2 | 김형주 | NULL | 인천 인하로   | 031-111 |
|   3 | 최학수 | NULL | 경기도 성남시 | 031-111 |
|   4 | 허슬기 | NULL | 서울 종로구   | 02-112  |
+-----+--------+------+---------------+---------+
4 rows in set (0.00 sec)

null 인 age 값을 num에 따라 다르게 채우려면 어떻게 할까요?

 

 

 

mysql> update student set age=22 where num=1;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> update student set age=26 where num=2;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> update student set age=17 where num=3;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> update student set age=19 where num=4;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

이해하기 쉽게 해석하면,

 

업데이트하라 학생 테이블에 age=?? 으로 . num 이 =? 번인 사람의.

 

mysql> select * from student;
+-----+--------+------+---------------+---------+
| num | name   | age  | adr           | tel     |
+-----+--------+------+---------------+---------+
|   1 | 이유진 |   22 | 경기도 수원시 | 031-419 |
|   2 | 김형주 |   26 | 인천 인하로   | 031-111 |
|   3 | 최학수 |   17 | 경기도 성남시 | 031-111 |
|   4 | 허슬기 |   19 | 서울 종로구   | 02-112  |
+-----+--------+------+---------------+---------+
4 rows in set (0.00 sec)

바뀐 것을 확인할 수 있습니다.

간단하고 재밌죠?

728x90
C:\APM_Setup\Server\MySQL\bin>mysql -uyou -p
Enter password: ****
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 7 to server version: 4.0.18-max-debug

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> use your_db;
Database changed
mysql> show tables;
Empty set (0.00 sec)

 들어가 봅시당.

 

먼저 사용할 db에 접속 후 table을 확인해줍니다. 아직 아무것도 없는 것을 확인할 수 있습니다.

 

 

 

 

 

mysql> create table student (num int, name char(10), adress char(40), tel char(20), primary key(num));
Query OK, 0 rows affected (0.03 sec)

mysql> insert student (num,name,adress,tel) values('1', '김형주', '인천 인하로', '032-119');
Query OK, 1 row affected (0.06 sec)

mysql> select * from student;
+-----+--------+-------------+---------+
| num | name   | adress      | tel     |
+-----+--------+-------------+---------+
|   1 | 김형주 | 인천 인하로 | 032-119 |
+-----+--------+-------------+---------+
1 row in set (0.01 sec)

먼저 이름이 student 인 table을 만들어줍니다. 그리고 필드명(num,name,adress,tel) 과 데이터 타입을 기록해줍니다. (첫번째 줄)

 

그리고 insert~ values 구문을 사용해 테이블에 들어갈 데이터들을 입력해줍니다.

 

select 문을 이용해 데이터가 잘 들어간 모습을 볼 수 있습니다.

 

 

같은 방법으로 몇 개 더 해주면

 

 

mysql> insert student (num,name,adress,tel) values('2', '이유진', '경기도 수원시', '031-419');
Query OK, 1 row affected (0.00 sec)

mysql> insert student (num,name,adress,tel) values('3', '김정연', '경기도 성남시', '031-222');
Query OK, 1 row affected (0.00 sec)

mysql> insert student (num,name,adress,tel) values('4', '박준', '서울시 관악구', '032-106');
Query OK, 1 row affected (0.00 sec)

mysql> select * from student;
+-----+--------+---------------+---------+
| num | name   | adress        | tel     |
+-----+--------+---------------+---------+
|   1 | 김형주 | 인천 인하로   | 032-119 |
|   2 | 이유진 | 경기도 수원시 | 031-419 |
|   3 | 김정연 | 경기도 성남시 | 031-222 |
|   4 | 박준   | 서울시 관악구 | 032-106 |
+-----+--------+---------------+---------+
4 rows in set (0.00 sec)

 

예쁘게 들어간 모습을 볼 수 있습니다.



※ 만약 database 를 잘못 생성해 지우고싶다면,
drop database 데이터베이스명;
입력해주시면 됩니다.

728x90

안녕하세요 유즈입니다. 피드백은 언제나 감사합니다.^^

 
접속 방법과 문법 등을 기본적인 실습을 통해 공부하고 그 기록을 남겨볼까 합니다.

 

 

오늘 실습한 내용)

1. 사용자 계정 'honggildong' 만들기. 비밀번호는 1234

2. DB hong_db 만들기.

3. honggildong 계정이 데이터베이스 hong_db 한테 12가지 모든 권한 주기.

4. honggildong 계정으로 들어가 DB 보고 나오기.

5. 비밀번호 abc로 바꾸기.

 

 

cmd로 프롬프트 실행 후

C:\Users\이유진>cd c:\

c:\>cd apm_setup

c:\APM_Setup>cd server

c:\APM_Setup\Server>cd mysql

c:\APM_Setup\Server\MySQL>cd bin

c:\APM_Setup\Server\MySQL\bin>mysql -uroot -p
Enter password: ********
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 14 to server version: 4.0.18-max-debug

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

접속해 줍니다.

 

 

mysql> use mysql
Database changed
mysql> select user,password from user;
+-------------+------------------+
| user        | password         |
+-------------+------------------+
| root        | 659210f56d1f4484 |
| nalog       | 659210f56d1f4484 |
| heo2        | 1234             |
| lee         | 446a12100c856ce9 |
| lyj         | 565491d704013245 |
+-------------+------------------+

생성할 계정의 user 가 겹치는 게 있는지 확인했습니다. (생략 가능)

 

 

 

 

 

 

 

insert into user (host, user, password) values (‘localhost’, ‘honggildong’, ‘password(1234’));
Query OK. 1 row affected (0.00 sec)

mysql> select user,password from user;
+-------------+------------------+
| user        | password         |
+-------------+------------------+
| root        | 659210f56d1f4484 |
| nalog       | 659210f56d1f4484 |
| heo2        | 1234             |
| lee         | 446a12100c856ce9 |
| lyj         | 565491d704013245 |
| honggildong | 565491d704013245 |
+-------------+------------------+
6 rows in set (0.01 sec)

 

1. honggildong 의 계정을 비밀번호와 함께 추가해 준 후,

select 문을 이용해 정상적으로 잘 들어갔는지 확인까지 해줍니다.

 

(혹시 잘못 쳐서 작성한 홍길동계정을 삭제하고 싶다면

delete from user where user='honggildong';  )

비밀번호 란에 password('~') 하는 이유는 암호화 하기 위해서 입니다. 암호화 안하면 생성된 계정으로 들어가지지않음.

만약 암호화 안하고 만들었다면
update user set password = password('~') where user = 'leeik';
으로 삭제하지 않고 간단히 수정할 수 있습니다.

 

 

 

 

 

mysql> create database hong_db;
Query OK, 1 row affected (0.00 sec)

2. hong_db 데이터베이스 생성을 합니다. 

생성 후 확인하고 싶으시다면 show databases; 을 활용하시면 됩니다.

 

 

 

 

 

 

mysql> insert into db values ('localhost', 'hong_db', 'honggildong', 'y', 'y', 'y'
, 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y');
Query OK, 1 row affected (0.01 sec)

mysql> select * from db;
+-----------+----------+------------+-------------+-------------+-------------+-------------+-------------+-----------+------------+-----------------+------------+------------+-----------------------+------------------+
| Host      | Db       | User       | Select_priv | Insert_priv | Update_priv | Delete_priv | Create_priv | Drop_priv | Grant_priv | References_priv | Index_priv | Alter_priv | Create_tmp_table_priv | Lock_tables_priv |
+-----------+----------+------------+-------------+-------------+-------------+-------------+-------------+-----------+------------+-----------------+------------+------------+-----------------------+------------------+
| localhost | db_nalog | nalog      | Y           | Y           | Y           | Y           | Y           | Y         | N          | N               | Y          | Y          | Y                     | N                |
| localhost | kim_db   | kim        | Y           | Y           | Y           | Y           | Y           | Y         | Y          | Y               | Y          | Y          | Y                     | Y                |
| localhost | hong_db  | hongildong | Y           | Y           | Y           | Y           | Y           | Y         | Y          | Y               | Y          | Y          | Y                     | Y                |
+-----------+----------+------------+-------------+-------------+-------------+-------------+-------------+-----------+------------+-----------------+------------+------------+-----------------------+------------------+
3 rows in set (0.01 sec)

3. 홍길동 계정이 홍db 계정에게 12가지의 모든 권한을 주고,

select 문으로 확인까지 했습니다. N 에서 Y로 변한 것을 볼 수 있습니다.

 

 

mysql> flush privileges;
Query OK, 0 rows affected (0.02 sec)

mysql> exit
Bye

변경내용을 저장해준 후 ,

빠져나옵니다.

 

 

 

 

c:\APM_Setup\Server\MySQL\bin>mysql -uhonggildong -p1234  
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 15 to server version: 4.0.18-max-debug

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

4. hong  계정에 접속이 정상적으로 이뤄진 것을 볼 수 있습니다.

show databases; 을 통해 db 도 확인해줍니다.

 

 

 

 

 

 

c:\APM_Setup\Server\MySQL\bin>mysql -uhonggildong -p123456
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 15 to server version: 4.0.18-max-debug

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> update user set password=password('abc') where user='honggildong';
Query OK, 1 row affected (0.01 sec)
일치하는 Rows : 1개 변경됨: 1개  경고: 0개

mysql> flush privileges;
Query OK, 1 row affected (0.03 sec)

mysql> exit
Bye

5. 변경 전 홍길동 계정으로 들어간 후 , 

 

비밀번호를 abc로 바꿔줍니다.

 

변경 내용을 flush 문을 통해 저장 후,

 

종료합니다.

 

 

 

 

 

 

 

 

 

 

간단하게 계정 생성부터 비밀번호 변경 완료 되었습니다.

 

+ Recent posts