2014년 1월 20일 월요일

Archlinux Install

1. Partitioning (bios-fdisk, boot 파티션 별도생성하지 않음) 
  1. parted /dev/sda 
  2. mktable gpt 
  3. quit 
  4. cgdisk /dev/sda 
  5. New > (Enter) > 7G > 8300 > {PARTITION_NAME} # /root, /dev/sda1 
  6. New > (Enter) > 1G > 8200 > {PARTITION_NAME} # swap, /dev/sda2 
  7. New > (Enter) > (Enter) > ef02 > {PARTITION_NAME} # bios_grub, /dev/sda3
  8. lsblk /dev/sda  // 파티션 확인 (선택) 
2. Create filesystem
  1. mkswap /dev/sda2
  2. swapon /dev/sda2
  3. mkfs.ext4 /dev/sda1
  4. mkfs.ext4 /dev/sda3
  5. lsblk -f  // 파티션 확인 (선택) 
3. Installing the base system
  1. mount /dev/sda1 /mnt
4. Choose mirror
  1. vi /etc/pacman.d/mirrorlist
  2. Japan Jaist // 미러 복사해서 최상단에 붙여넣기
5. Install base packages
  1. pacstrap -i /mnt base base-devel
6. Configure fstab
  1. genfstab -U -p /mnt >> /mnt/etc/fstab
  2. vi /mnt/etc/fstab
  3. arch-chroot /mnt
7. Language and location settings
  1. vi /etc/locale.gen
  2. en_US.UTF-8 UTF-8 주석해제
  3. locale-gen
  4. echo LANG=en_US.UTF-8 > /etc/locale.conf
  5. export LANG=en_US.UTF-8
8. Time zone
  1. ln -s /usr/share/zoneinfo/Asia/Seoul /etc/localtime
  2. hwclock --hctosys --localtime
  3. echo archlinux > /etc/hostname
9. Configure repositories
  1. vi /etc/pacman.conf
  2. [multilib] Include = /etc/pacman.d/mirrorlist ##uncomment
  3. pacman -Sy
10. Install boot loader
  1. pacman -S grub
  2. grub-install --target=i386-pc --recheck /dev/sda
  3. pacman -S os-prober // 멀티부팅이라면
  4. grub-mkconfig -o /boot/grub/grub.cfg
  5. systemctl enable dhcpcd.service
  6. systemctl start dhcpcd.service
  7. exit
  8. umount -R /mnt
  9. reboot
11. Install Yaourt
  • vi /etc/pacman.conf
[archlinuxfr]
SigLevel = Never
  • pacman -Sy yaourt
12. Install Package
  • xorg-server
  • xorg-xinit
  • bspwm ##chmod +x set
  • sxhkd ##chmod +x set
  • rxvt-unicode-multi-display-256xresources
  • urxvt-perls-git
  • alsa-utils

13. Install VirtualBox Guest Additions

Now you should install VirtualBox Guest Additions inside the VM. The Guest Additions will enable very useful features like dynamically resizing the VM window, copy & paste between guest and host, time sync between guest & host, and accessing the host file system from the guest.
  1. Install packages:
    sudo pacman -S virtualbox-guest-utils
    sudo pacman -S virtualbox-guest-modules
    sudo pacman -S virtualbox-guest-modules-lts
    sudo pacman -S virtualbox-guest-dkms
    
  2. Create /etc/modules-load.d/virtualbox.conf which contains the following three lines:
    vboxguest 
    vboxsf
    vboxvideo
    
  3. In order to synchronize time with the host machine, type the following:
    sudo systemctl enable vboxservice.service
    
  4. Enable “Bidirectional” Shared Clipboard from VirtualBox Manager’s Settings / General / Advanced menu.
  5. Reboot the VM and type ps ax | grep -i vbox. You should see an output like this:
    139 ?        Ssl    0:00 /usr/bin/VBoxService -f
    402 ?        Sl     0:00 /usr/bin/VBoxClient --clipboard
    414 ?        Sl     0:00 /usr/bin/VBoxClient --display
    420 ?        Sl     0:00 /usr/bin/VBoxClient --seamless
    425 ?        Sl     0:00 /usr/bin/VBoxClient --draganddrop
    
    Try copy & paste between host and guest.

2014년 1월 16일 목요일

FFMPEG 초기 설정

개발환경

- Windows 64bit 
- Visual Studio 2013
 
FFMPEG 라이브러리 구하기 (http://ffmpeg.zeranoe.com/builds/)
여기에 윈도우용 ffmpeg 라이브러리 DLL 파일이 있다. 32 비트 파일과 64비트 파일 둘 다 지원한다. 또한 static, share, dev 용으로 구분 되어져 있는데 share과 dev용을 다운 받는다.
dev 압축파일을 적당한 위치에 압축을 풀어준다. 그리고 share 압축 파일에서 BIN 디렉토리의 DLL만 선택 후 dev 압축이 풀린 폴더에서 lib 폴더에 복사한다. dev 압축 파일에 include 파일과 lib 파일만 공개하고 실행시 필요한 DLL 파일은 share에서 포함되어 있기 때문이다.
 
개발환경
Visual Studio에서 ffmpeg 라이브러릴 사용하기 위해서 프로젝트 속성설정에서 DEV 압축 풀린 폴더에서 include 및 DLL 파일을 설정한다.
  1. 프로젝트 속성->C/C++ –>일반 –> 추가 포함 디렉토리 –> DEV 압축 푼 폴더/include 
  2. 프로젝트 속성->링커->일반->추가 라이브러리 디렉토리 -> DEV 압축 푼 폴더/lib 
 
그리고 관련 lib 연결 소스 코드 Stdafx.h에서 연결했다.

extern "C"
{
#include "ffmpeg/include/libswscale/swscale.h"
#include "ffmpeg/include/libavformat/avformat.h"
#include "ffmpeg/include/libavformat/avio.h"
#include "ffmpeg/include/libavcodec/avcodec.h"
}
#pragma comment( lib, "avcodec.lib")
#pragma comment(lib, "avformat.lib")
#pragma comment(lib, "avutil.lib")
#pragma comment(lib, "swscale.lib")

 
영상 디코딩
FFMPEG을 사용하기 위해선 인코딩 이던 디코딩이던 라이브러리를 초기화가 필요하다. 전체 프로그램에서 한번만 호출 해 주면 된다.
avcodec_register_all();
예전 버전에는 avcodec_init(); 함수도 있었지만 버전업 되면서 이 함수가 없어졌다.
영상을 디코딩 하기 위해서
AVCodec 과 AVCodecContext 두 변수가 필요하다.
AVCodec은 어떤 코덱(MPEG, MJPEG, H264)인지를 나타내는 정보를 가지고 있으며
AVCodecContext는 스트림을 어떻게 디코딩 할 것인지 정보를 가지고 있다.
이 두 변수를 각각 전역이든 멤버 변수든 선언해 준다.
   1: AVCodec *                m_codec;
   2: AVCodecContext *        m_context;
그리고 각 변수를 초기화 해준다.
   1: m_codec = avcodec_find_decoder(CODEC_ID_H264);
   2: m_context = avcodec_alloc_context3(m_codec);
   3: avcodec_get_context_defaults(m_context);

avcodec_find_decoder(CodecID)
이 함수는 디코딩 코덱을 선택해서 m_codec을 초기화 해준다. CodecID는 avcodec.h에 정의되어 있다. 여기선 H264 코덱을 선택했다.
avcodec_alloc_context3(AVCodec*)
이 함수는 m_context 변수를 초기화 해주는 함수로 AVCodec 정보를 가지고 context를 메모리에 할당한다. 계속 FFMPEG이 버전업 되면서 끝에 숫자가 증가하는 것 같다. 이유? 나도 모른다. 검색해서 찾아 볼 여유가 없었다. ㅋㅋ
avcodec_get_context_defaults(AVCodecContext*)
context 변수를 초기화 하는 함수이다. 호출 안해도 상관 없다. 왜??? avcodec_alloc_context3에서 초기화가 이루어 졌으니까..
초기화가 되었으니까, 이제 어떤 영상 스트림을 디코딩 할것인지 직접 입력해 줘야 한다.
   1: m_context->width = 320;
   2: m_context->height = 240;
   3: m_context->codec_id = CODEC_ID_H264;
   4: m_context->codec_type = AVMEDIA_TYPE_VIDEO;
   5: m_context->flags2 |= CODEC_FLAG2_FAST;
   6: m_context->thread_count = 0;
 
width, height는 320, 240이고, 코덱은 H264, AVMEDIA_TYPE_VIDEO로 비디오를 디코딩 한다는걸 설정하고 CODEC_FLAG2_FAST는 그냥 샘플 코드에 있어서 넣어 봤다. 빼도 상관 없다. thread_count 몇개의 쓰레드로 디코딩 하는지 명시하는 부분인데, 나도 모르겠다. 저 값에 10을 넣으나 1을 넣으나 속도는 같은 것 같은데 왜 적용이 안 되는지 모르겠다. 0은 라이브러리가 알아서 쓰레드 만든다 라고 FFMPEG 문서에 있다. 이것도 제대로 되는지 모르겠다. 흠흠…
설정 정보 다 입력했으면 최종 FFMPEG 라이브러리를 설정해야 한다.
   1: avcodec_open2(m_context, m_codec);

요렇게만 하면 이제 디코딩 하기 위한 준비는 다 끝났다.
이제 스트림 데이터가 있는 변수를 ffmpeg 라이브러리에 넘겨 주고 디코딩 시키면 된다.
   1: AVPacket avpkt;
   2:  
   3:  
   4: av_init_packet(&avpkt);
   5:  
   6: avpkt.data = pEncodedData;
   7: avpkt.size = EncodedSize;
예전 버전에서는 스트림 데이터를 바로 이용했는데 어느 순간 버전업 되면서 AVPacket을 이용해야 했다. av_init_packet으로 초기화 해주고 data와 size에 스트림 데이터, 데이크 크기를 전달 한다.

   1: int got;
   2: int ret;
   3: AVFrame *m_picture;
   4:  
   5: m_picture = avcodec_alloc_frame();
   6:  
   7: ret = avcodec_decode_video2(m_context,m_picture, &got, &avpkt );
   8:  
   9: if( got > 0 )
  10: {
  11:   ...........
  12: }
 
깜박하고 디코딩시 디코딩 된 이미지 데이터를 저장할 변수를 초기화 하지 않았다. ^^ avcodec_alloc_frame()으로 이미지 변수를 할당 받는다.

avcodec_decode_video2(AVContext*, AVFrame*, int *, AVPacket *)
스트림 데이터를 이미지로 변환하는 함수다. 만약 이미지로 변환이 성공하면 got 변수에 0 보다 큰 값을 리턴한다.




 
영상 인코딩
초기화 기본은 디코딩과 같다. 다만 avcodec_find_decoder가 avcodec_find_encoder로 변경되었을 뿐이다.
   1: m_codec = avcodec_find_encoder(CODEC_ID_H264);
   2: m_context = avcodec_alloc_context3(m_codec);
   3: avcodec_get_context_defaults(m_context);
그리고 압축을 하기위한 설정을 context에 입력한다.
   1:  
   2: m_context->bit_rate = 512*1024;
   3: m_context->bit_rate_tolerance = 512*1024*2;
   4: m_context->width = 320;
   5: m_context->height = 240;
   6: m_context->time_base.num = 1;
   7: m_context->time_base.den = 24;
   8: m_context->gop_size = 24;
   9: m_context->profile = FF_PROFILE_H264_BASELINE;
  10: m_context->pix_fmt = PIX_FMT_YUV420P; 
  11:  
  12: av_opt_set(m_context->priv_data, "preset", "fast", 0);
  13: av_opt_set(m_context->priv_data, "profile", "baseline", 0);
  14:  
  15:  
압축될 영상은 320, 240 사이즈로 설정하고 비트레이트는 512kbps 로 설정했다. 또한 FPS 24, GOP는 24다. 그리고 압축을 H264로 하기 때문에 프로파일은 BASELINE. 예전 버전에서는 없었는데 버전업 되면서 생긴 av_opt_set 으로 preset, profile을 설정했다. 뭐 이렇게 써라고 하니 썼다… 정확하지는 않는다. 그냥 인터넷에서 긁어 모으다 보니~~ ㅋㅋㅋ
   1: AVFrame* m_picture;
   2:  
   3: m_picture = avcodec_alloc_frame();
   4:  
디코딩과 마찬가지로 인코딩도 AVFrame 으로 영상 데이터를 입력 받는다. 그래서 AVFrame을 할당 받는다.
인코딩은 보통 YUV420P 로만 입력 받는다. RGB24로 입력 해봤지만 계속 실패해서 성공해 본적이 없다. 버전업 되면서 지원 되는지 모르겠지만.. 예전에는 안 되었다. 그래서 영상 데이터를 YUV420P 로 변환 해 줘야 한다.
   1: struct SwsContext *    m_convert_ctx;
   2: AVPicture dstpic;
   3: AVPicture srcpic;
   4:  
   5: m_convert_ctx = sws_getContext( 320, 240, PIX_FMT_BGR24, 320, 240, PIX_FMT_YUV420P, SWS_FAST_BILINEAR | SWS_CPU_CAPS_MMX, NULL, NULL);
   6:  
   7: avpicture_fill(&dstpic, m_YUVImageData, PIX_FMT_YUV420P, 320, 240);
   8: avpicture_fill(&srcpic, m_RGBImageData, PIX_FMT_BGR24, 320, 240);
   9:  
  10: sws_scale( m_convert_ctx, srcpic.data, srcpic.linesize, 0, 240, dstpic.data, dstpic.linesize);
  11:  
변환을 위해서 sws_getContext() 함수를 이용한다. sws_getContext()함수로 변환 핸들을 얻은 후 이 핸들을 sws_scale()로 실질적인 변환 작업을 한다. sws_getContext는 소스의 가로, 세로, 파일포맷, 변환할 가로, 세로, 포맷을 지정한다. sws_scale 함수는 소스 AVPicture를 변환 AVPicture로 변환해 준다. ㅋㅋㅋ 뭔 소린지 ㅋㅋㅋ
BGR24를 YUV420P로 변환 하였다. 이제 인코딩 하면 된다.
   1: int encoded_size = 0;
   2: BYTE *ENCODED_DATA = 1024*1024;
   3: int ENCODED_SIZE = 1024*1024;
   4:  
   5: avpicture_fill((AVPicture*)m_picture, m_YUVImageData, 320, 240);
   6:  
   7: encoded_size = avcodec_encode_video(m_context, ENCODED_DATA, ENCODED_SIZE, m_picture);
   8:  
자 요렇게 인코딩 하면 된다.

2013년 12월 24일 화요일

MySQL 기본 사용법 및 예제

MySql에 대한 기본 사용방법 및 명령어에 대해 알아본다.

- 목차 -

1. Mysql 기본 사용법
2. 데이터베이스 생성 및 삭제
3. 새로 생성한 데이터베이스 등록하기
4.  Mysql 사용자등록
5. 테이블 생성 및 삭제
6. 테이블속성 및 구조변경법
7. 데이터 입력하기 (INSERT)
8. 데이터 검색 (SELECT)
9. 데이터 수정하기(UPDATE)
10. 데이터 삭제하기(DELETE)
11. 새로운 사용자 등록
12. 일반사용자 권한설정(보안사항)
13 .Mysql root 암호 변경하기
14. root 패스워드를 잊어버렸을 때는 어떻게?
15. 특정 테이블의 구조보기
16. 현재 상태 보기(STATUS)



1. Mysql 기본 사용법


● Mysql 데이터베이스 접속하기

# mysql -u 사용자명 -p dbname

설치 직후에는 root 사용자에 비밀번호가 없으므로 다음과 같이 접속하여 MySQL을 관리할 수 있다.

# mysql -u root mysql


● mysql 관리자 root 패스워드 설정하기

MySQL을 설치한 직후에는 root 계정에 암호가 지정되어 있지 않다.
다음 세가지 방법으로 비밀번호를 변경 할 수 있다.

 ▶ mysqladmin이용
# mysqladmin -u root password 새비밀번호

 ▶ update문 이용
# mysql -u root mysql

mysql> UPDATE user SET password=password('새비밀번호') WHERE user='root';
mysql> FLUSH PRIVILEGES;

mysql> update user set password = password('shcm0816') where user = ' root';

일단 root 비밀번호가 설정된 상태에서는 
mysql이나 mysqladmin 명령을 실행할 때 -p 옵션을 붙여주고 
기존 비밀번호를 입력해야만 한다.

 ▶ Set Password 이용
SET PASSWORD FOR root=password('새비밀번호');


 ▶ 빠져나간후 데이터베이스를 재시작
# mysqladmin -u root reload

 ▶ 패스워드 입력
# mysql -u root -p mysql



● 사용자 추가/삭제

mysql> GRANT ALL PRIVILEGES ON dbname.* TO username@localhost IDENTIFIED BY 'password';

username 이라는 사용자를 password라는 비밀번호를 갖도록 하여 추가한다. 
username은 dbname이라는 데이타베이스에 대해 모든 권한을 가지고 있다.
username 사용자는 로컬 호스트에서만 접속할 수 있다. 

 ▶ 다른 호스트에서 접속하려면
mysql> GRANT ALL PRIVILEGES ON dbname.* TO username@'%' IDENTIFIED BY 'password';

위를 또한 번 실행한다. '%'에서 홑따옴표를 주의한다.

 ※ 추가
'%'를 호스트네임으로 지정해도 모든 호스트에서 접속할 수 없었다. 
각 호스트별로 다 지정해야 했다.

 ▶ 불필요한 사용자 삭제는
mysql> DLETE FROM user WHERE user='username';
mysql> FLUSH PRIVILEGES;





2. 데이터베이스 생성 및 삭제

● 데이터베이스 생성

① 첫번째 방법
# mysql -u root -p mysqlll
    msyql> create database TESTDB;
    msyql> show databases;

② 두번째 방법
# ./mysqladmin -u root -p create testdb2
Enter password:
# ./mysql -u root -p mysql
Enter passwor

현재 존재하는 데이터베이스 목록을 보여준다.
cd /
msyql> show databases;
msyql> exit
Bye
#

특정 데이타베이스를 사용하겠다고 선언한다.
mysql> USE dbname;


● 데이타 베이스 삭제

# ./mysqladmin -u root -p drop testdb2
Enter password:

-- mysql> DROP DATABASE [IF EXISTS] dbname;
mysql> drop database testdb2

IF EXISTS 옵션은 비록 데이타베이스가 없더라도 오류를 발생시키지 말라는 의미이다.

# ./mysql -u root -p mysql
msyql> show databases;
msyql> desc user =>동일한 결과



3. 새로 생성한 데이터베이스 등록하기

데이터베이스를 새로 생성한 후에는 mysql 이라는 관리용 데이터베이스에 등록한다.
mysql 이라는 데이터베이스의 db라는 테이블에 TESTDB를 등록한 것

msyql> insert into db  values('%','TESTDB','root','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
msyql> select host, db, user from db;



4.  Mysql 사용자등록(데이터베이스 소유자)

 ▶ mysql 을 사용할 사용자는 반드시 user 라는 테이블에 등록을 해줘야함
msyql> insert into user (host, user, password) values('localhost', 'sspark', password('shcm0816'));

 ▶ 정상적인 등록여부 확인
msyql> select host, user, password from user; 

 ▶ sspark이라는 사용자로 mysql 데이터베이스로 접속
msyql> mysql -u sspark -p
Enter password:

 ▶ 새로운 데이터베이스를 생성하거나 새로운 사용자를 생성한 후에는 
    반드시 reload를 해줘야함
# mysqladmin -u root -p reload
Enter password:




5. 테이블 생성 및 삭제

 ▶ 테이블 생성
msyql> create table testtable (
         ->uid mediumint(4) unsigned DEFAULT '0' NOT NULL auto_increment,
         -> name varchar(12) DEFAULT "" NOT NULL,
         -> email varchar (20) DEFAULT "" NOT NULL,
         -> PRIMARY KEY (uid)
         -> );
Query OK, 0 rows affected (0.00 sec)

 ▶ 현재 데이터베이스의 테이블 목록 확인
msyql>show tables;

 ▶ 필드 구조가 정의한 필드구조로 생성되었는지 확인
msyql> desc testtable;

 ▶ 테이블 삭제
msyql> drop table testtable;
mysql> show tables;



6. 테이블속성 및 구조변경법

 ▶ 테이블 구조 확인
mysql> EXPLAIN tablesname;
혹은
mysql> DESCRIBE tablename;

 ▶ 기존 테이블에 필드 추가하기
ALTER TABLE 테이블명 CHANGE[COLUMN] 필드명 필드타입

mysql> er table testtable add column homepage varchar(30);
mysql> desc testtable;

 ▶ 기존에 필드 속성 변경하기
ALTER TABLE 테이블명 CHANGE[COLUMN] 기존필드명 새필드명 필드타입

mysql> er table testtable change column homepage home varchar(50);

 ▶ 테이블 이름 변경
mysql> RENAME TABLE tablename1 TO tablename2[, tablename3 TO tablename4];

 ▶ 기존에 필드 삭제
ALTER TABLE 테이블명 DROP [COLUMN] 필드명

mysql> er table testtable drop column home;
mysql> desc testtable;

 ▶ 기존의 테이블삭제하기
mysql> create table sampletable
mysql> show tables;
mysql> drop table sampletable;
mysql> show tables;



7. 데이터 입력하기 (INSERT)

INSERT INTO tablename VALUES(값1, 값2, ...);

mysql> insert into testtable (uid, name, email) 
mysql> values (', 'parksungsoo', sspark09@soback.kornet.net'" target=_blank>'sspark09@soback.kornet.net');

 ※ 주의: uid라는 필드는 auto_increment 라는 속성으로 생성했기 때문에 
이 속성을 가진 필드들은 실제로 데이터값을 주지 않아도 자동적으로 1씩 증가.

 ▶ 삽입할 필드는 생략가능
mysql> insert into testtable values(','sontaesoo','shutterbug@orgio.net');


특정 필드에만 데이터를 입력할 경우에는 
입력할 필드이름만을 나열하고 그에 해당하는 데이터를 입력한다.

mysql> insert into testtable (uid,name) values(','junwooki');

 ▶ 정상적으로 입력되었는지 확인
mysql> select * from testtable;




8. 데이터 검색 (SELECT)

SELECT col1, col2, ... FROM tablename;

 ▶ 테이블의 모든 테이터를 검색
mysql> select * from testtable;

컬럼명을 *로 하면 모든 컬럼 의미.

 ▶ uid와 name 필드만을 조회
mysql> select uid, name from testtable;

 ▶ where문을 사용하여 특정 조건에 맞는 데이터만을 검색
mysql> select * from testtable where name = "sontaesoo";

 ▶ 출력 결과 레코드의 중복제거하기(DISTINCT)
SELECT DISTINCT sex FROM testtable;

 ▶ 'soo'라는 문자가 포함된 데이터를 모두 검색 (LIKE)
SELECT name FROM testtable WHERE name LIKE '%soo%'

mysql> select name from testtable where name LIKE '%soo%';

 ▶ 특정한  한 문자로 시작하는 데이터만을 출력
SELECT name FROM testable WHERE name LIKE 'park%'

mysql> select name from testtable where name LIKE 'park%';

 ▶ 특정 필드에 데이터가 NULL 인 경우
SELECT uid, name FROM testtable WHERE age IS NULL

mysql> select uid, name from testtable where age IS NULL;

 ▶ 특정 필드의 데이터가 NULL이 아닌 경우
SELECT uid, name FROM testtable WHERE age IS NULL

mysql> select uid, name from testtable where age IS NOT NULL;

 ▶ WHERE 조건문이 여러개 일 경우 (AND/OR) 
mysql> SELECT name, uid, email FROM testtable WHERE savem > 5000 AND sex='M';

 ▶ 결과데이터를 정렬하기 (ORDER BY)
mysql> SELECT name, uid, savem FROM testtable WHERE savem >= 5000 ORDER BY savem DESC;

DESC는 내림차순 ASC는 오름차순.

 ▶ 총 개수 구하기 (COUNT())
mysql> SELECT count(*) FROM testtable WHERE sex='M';

 ▶ 평균 구하기 (AVG())
mysql> SELECT avg(savem) FROM testtable WHERE sex='M';

 ▶ 컬럼의 이름을 바꿔서 출력.
mysql> SELECT col1 AS '성명', col2 AS '국어점수' FROM grade;
mysql> SELECT col1, korean + math + english AS '총점' FROM tablename ORDER BY '총점' ASC;

 ▶ 결과중 처음부터 10개만 가져오기
mysql> SELECT * FROM grade LIMIT 10;

 ▶ 결과중 100번째부터 10개만 가져오기.(첫번째 레코드는 0번 부터 시작한다.)
mysql> SELECT * FROM grade LIMIT 100, 10;



9. 데이터 수정하기(UPDATE)

UPDATE 테이블명 
SET 필드명=필드값 또는 산술식 {, 필드명 = 필드값 또는 산술식}
[WHERE 검색조건]

mysql> select * from testtable;

 ▶ uid 4 번의 데이터에 name 값과 email을 입력해 봄
mysql> update testtable set name = 'junyangmi' where age = 23;
mysql> update testtable set email = jym@superuser.co.kr'" target=_blank>'jym@superuser.co.kr' where age = 23;
mysql> select * from testtable;

 ▶ uid 1 인 사람 (parksungsoo)의 나이를 25살로 수정
mysql> update testtable set age= 25 where uid =1;

 ▶ uid 2인 사람의 나이를 30살로 수정
mysql> update testtable set age = 30 where uid =2;
mysql> update testtable set age = 41 where uid=3;

 ▶ 한해가 지났으므로 모든 사람의 나이를 한 살씩 증가
mysql> update testtable set age = age + 1;
mysql> select * from testtable;



10. 데이터 삭제하기(DELETE)

DELETE FROM 테이블명 [WHERE 검색조건]

mysql> select * from testtable;
mysql> delete from testtable where uid = 3;



11. 새로운 사용자 등록

 ▶ Mysql 에 root로 접속
./mysql -u root -p

 ▶ Mysql DB 선택
mysql> use mysql;
mysql> show tables;

 ▶ 새로운 DB 생성
mysql> create database xlare;

 ▶ user 테이블에 입력 
(user 라는 테이블에 새로운 사용자의 계정이름과 권한설정을 할 차례)
호스팅사용자에 대한 설정 user테이블에 현재 사용장0ㅔ 대한 권한들을 모두 'N'로 설정
mysql> insert into user valuses('localhost', 'xlare', password('123'),'Y','Y','Y','Y','Y','N','N','N','N','N','N','N','N','N');

 ▶ user  테이블에 입력확인
mysql> select * from user where user = 'xlare' ;

 ▶ db 테이블에 입력
mysql> insert into db values('localhost', 'xlare', 'xlare', 'Y','Y','Y','Y','Y','N','N','N','N','N',);

 ▶ db 테이블에 입력 확인
mysql> select * from db where db = 'xlare';

새로운 설정을 바로 적용키위해 mysqladmin 이라는 관리자명령어로 mysql을 재시작한다.
reload를 해주지 않으면 생성했던 것들이 적용이 되지 않는다

# ./mysqladmin -u root -p reload;




12. 일반사용자 권한설정(보안사항)

#./mysql -u root -p mysql
Enter password:
mysql> show tables;
--------------------
tables in mysql
--------------------
columns_priv
db
func
host
tables_priv
user
----------------------

 ▶ columns_priv 테이블
모든 특정 DB 의 특정 User 에 대한 특정 테이블의 각 컬럼에 대한 
select, insert, update, reference 권한을 설정한다.

mysql> desc columns_priv;

 ▶ db 테이블
db라는 테이블에는 특정 DB에 대한 user들의 여러가지 권한들을 설정하는 테이블

mysql> desc db;

kebia 라는 데이터베이스의 소유자와 그 권한에 대해서 알아보고자 한다.
kebia 라는 데이터베이스의 소유자는 hyung 이라는 mysqkl 사용자이며 
이 hyung 이라는 사용자는 이 kebia 라는 데이터베이스에 대한 각종 권한을 볼수 있다.

mysql> select * from db where db = 'kebia';
| localhost | kebia | hyung | Y  |   - - - - - ...........
------------------------

 ▶ tables_priv테이블
columns_priv 테이블처럼 각 데이터베이스와 사용자 및 그 테이블에 대한 권한을 설정한다.

mysql > desc tables_priv;
---------------------

 ▶ user 테이블
- 새로운 사용자를 생성할 때 이 테이블에 등록한다.
- 특정 사용자에 대한 Mysql에 존재하는 모든 데이터베이스에 대한 권한을 설정한다.
- 특정 사용자의 어떤권한에 대한 사항은 특정 데이터베이스가 아니라 Mysql에 존재하는 모든 데이터베이스에 권한이 주어진다.
- host와 user, password 항목을 제외한 나머지 권한들은 모두 'N'으로 설정한다.
- 특정한 사용자에 대한 특정한 데이터베이스에 대한 권한을 주려면 위에서 보았던 db라는 테이블에서 그 권한설정을 하는것이 안전하다.



13 .Mysql root 암호 변경하기

 ▶ 방법 1
mysqladmin 이라는 명령어 사용
# ./mysqladmin -u root -p password 12345

 ▶ 방법 2
mysql의 set 이란 명령어로 root 암호 변경
# ./mysql -u root -p mysql
mysql> set password for root=passwd('12345678');

 ▶ 방법 3
mysql 데이터베이스로 접속하여 update문을 사용하는 방법
# ./mysql -u root -p mysql
mysql> update user set password=password('12345' where user = 'root';
mysql> flush privileges;

 ▶ flush-privileges
권한 테이블을 재시작한다. 권한 설정을 변경했을경우 반드시 재시작한다.
mysql> flush privileges;



14. root 패스워드를 잊어버렸을 때는 어떻게?

 ▶ 단계 1
실행중인 mysql 종료
# ps -ef | grep mysqld
# killall mysqld

 ▶ 단계 2
grant-table 미사용모드로 mysql시작 및 root로 접속
# .safe_mysqld --skip-grant-tables&

 ▶ 단계 3
update문으로 root사용자 패스워드 변경
mysql> update user set password=password('12345') where user = 'root';
mysql> flush privileges;

 ▶ 단계 4
실행중인 mysql 다시 종료
# ps -ef | grep mysqld
# killall mysqld

 ▶ 단계 5
일반모드로 Mysql 재시작
# ./safe_mysqld&
# ps -ef | grep mysql



15. 특정 테이블의 구조보기(show columns from 테이블)

특정테이블의 필드명 type, 설정값들을 보기 위한 것이다.

 ▶ 특정한 테이블의 칼럼(필드)구조 확인
SHOW COLUMNS FROM tablename;

mysql> show columns form user;

 ▶ 필드 구조가 정의한 필드구조로 생성되었는지 확인
DESC 테이블명

 ▶ 특정 테이블의 인덱스 보기
mysql> show index from user;

 ▶ 데이타베이스의 설정상태 보기(show status)
mysql> show status;
# ./mysqladmin -u root -p status

 ▶ 데이터베이스의 설정환경변수와 값보기(show variables)
mysql> show variables;
# ./mysqladmin -u root -p variables

 ▶ 현재 데이터베이스에 연결된 프로세스들 보기(show processlist)
# ./mysqladmin -u root -p processlist


 ▶ mysql 원격접속 권한 설정

mysql> use mysql
mysql> grant all privileges on *.* to 'oops'@'192.168.5.14'      
mysql> identified by 'passwd' with grant option;

ip대신 % 를 주면 모든 호스트허용!
oops 라는 유저가 모든 권한을 부여받을 수있다. 
단 해당 아이피의 호스트 에서만.
이와 같은 설정은 select host,user from user; 로 확인해볼수 있다.



16. 현재 상태 보기

mysql> status;

--------------
mysql Ver 11.18 Distrib 3.23.58, for pc-linux (i686)

Connection id: 26
Current database: study
Current user: study@localhost
Current pager: stdout
Using outfile: '
Server version: 3.23.58
Protocol version: 10
Connection: Localhost via UNIX socket
Client characterset: latin1
Server characterset: euc_kr
UNIX socket: /var/lib/mysql/mysql.sock
Uptime: 2 hours 9 min 59 sec

Threads: 1 Questions: 160 Slow queries: 0 Opens: 28 Flush tables: 1
Open tables: 1 Queries per second avg: 0.021
--------------