Thứ Ba, 8 tháng 7, 2014

[Oracle] Sử dụng kỹ thuật Flashback để phục hồi dữ liệu

Bài tut hướng dẫn dùng kỹ thuật flashback, tối về thử ^^
http://kythuatlaptrinh.com/noi-dung/restore-to-the-points-trong-oracle-10g.html

Bổ sung:
sau khi restore lại database tại 1 restore point nào đó, thì để open lại database cần ở chế độ RESETLOGS hoặc NORESETLOGS:
SQL> alter database open resetlogs;

Thứ Tư, 2 tháng 7, 2014

[Linux] Hướng dẫn sử dụng vi editor căn bản

Trình soạn thảo văn bản khá phổ biến trong Unix. Có một chút kiến thức về vi có thể giúp bạn trong khá nhiều khi làm việc với unix.
Mình có tham khảo web site này hướng dẫn khá chi tiết về cách sử dụng vi editor : http://www.washington.edu/computing/unix/vi.html

Trích dẫn :
-------------------------------------------------------

Entering Text

In order to begin entering text in this empty file, you must change from command mode to insert mode. To do this, type
      i
Nothing appears to change, but you are now in insert mode and can begin typing text. In general, vi's commands do not display on the screen and do not require the Return key to be pressed.
Type a few short lines and press <Return> at the end of each line. If you type a long line, you will notice the vi does not word wrap, it merely breaks the line unceremoniously at the edge of the screen.
If you make a mistake, pressing <Backspace> or <Delete> may remove the error, depending on your terminal type.

Moving the Cursor

To move the cursor to another position, you must be in command mode. If you have just finished typing text, you are still in insert mode. Go back to command mode by pressing <Esc>. If you are not sure which mode you are in, press <Esc> once or twice until you hear a beep. When you hear the beep, you are in command mode.
The cursor is controlled with four keys: h, j, k, l.
     Key        Cursor Movement
     ---        ---------------
     h        left one space
     j        down one line
     k        up one line
     l        right one space
When you have gone as far as possible in one direction, the cursor stops moving and you hear a beep. For example, you cannot use l to move right and wrap around to the next line, you must use j to move down a line. See the section entitled "Moving Around in a File" for ways to move more quickly through a file.

Basic Editing

Editing commands require that you be command mode. Many of the editing commands have a different function depending on whether they are typed as upper- or lowercase. Often, editing commands can be preceded by a number to indicate a repetition of the command.

Deleting Characters

To delete a character from a file, move the cursor until it is on the incorrect letter, then type
      x
The character under the cursor disappears. To remove four characters (the one under the cursor and the next three) type
     4x
To delete the character before the cursor, type
      X (uppercase)

Deleting Words

To delete a word, move the cursor to the first letter of the word, and type
      dw
This command deletes the word and the space following it.
To delete three words type
       3dw

Deleting Lines

To delete a whole line, type
       dd
The cursor does not have to be at the beginning of the line. Typing dd deletes the entire line containing the cursor and places the cursor at the start of the next line. To delete two lines, type
       2dd
To delete from the cursor position to the end of the line, type
       D (uppercase)

Replacing Characters

To replace one character with another:
  1. Move the cursor to the character to be replaced.
  2. Type r
  3. Type the replacement character.
The new character will appear, and you will still be in command mode.

Replacing Words

To replace one word with another, move to the start of the incorrect word and type
     cw
The last letter of the word to be replaced will turn into a $. You are now in insert mode and may type the replacement. The new text does not need to be the same length as the original. Press <Esc> to get back to command mode. To replace three words, type
     3cw

Replacing Lines

To change text from the cursor position to the end of the line:
  1. Type C (uppercase).
  2. Type the replacement text.
  3. Press <Esc>.

Inserting Text

To insert text in a line:
  1. Position the cursor where the new text should go.
  2. Type i
  3. Enter the new text.
The text is inserted BEFORE the cursor.
4. Press <Esc> to get back to command mode.

Appending Text

To add text to the end of a line:
  1. Position the cursor on the last letter of the line.
  2. Type a
  3. Enter the new text.
This adds text AFTER the cursor.
4. Press <Esc> to get back to command mode.

Opening a Blank Line

To insert a blank line below the current line, type
     o (lowercase)
      
To insert a blank line above the current line, type
     O (uppercase)

Joining Lines

To join two lines together:
  1. Put the cursor on the first line to be joined.
  2. Type J
To join three lines together:
  1. Put the cursor on the first line to be joined.
  2. Type 3J

Undoing

To undo your most recent edit, type
     u
To undo all the edits on a single line, type
     U (uppercase)
Undoing all edits on a single line only works as long as the cursor stays on that line. Once you move the cursor off a line, you cannot use U to restore the line.

Moving Around in a File

There are shortcuts to move more quickly though a file. All these work in command mode.
     Key            Movement
     ---            --------
     w            forward word by word
     b            backward word by word
     $            to end of line
     0 (zero)     to beginning of line
     H            to top line of screen
     M            to middle line of screen
     L            to last line of screen
     G            to last line of file
     1G           to first line of file
     <Control>f   scroll forward one screen
     <Control>b   scroll backward one screen
     <Control>d   scroll down one-half screen
     <Control>u   scroll up one-half screen

Moving by Searching

To move quickly by searching for text, while in command mode:
  1. Type / (slash).
  2. Enter the text to search for.
  3. Press <Return>.
The cursor moves to the first occurrence of that text.
To repeat the search in a forward direction, type
     n
To repeat the search in a backward direction, type
     N

Closing and Saving a File

With vi, you edit a copy of the file, rather than the original file. Changes are made to the original only when you save your edits.
To save the file and quit vi, type
     ZZ
The vi editor editor is built on an earler Unix text editor called ex. ex commands can be used within vi. ex commands begin with a : (colon) and end with a <Return>. The command is displayed on the status line as you type. Some ex commands are useful when saving and closing files.
To save the edits you have made, but leave vi running and your file open:
  1. Press <Esc>.
  2. Type :w
  3. Press <Return>.
To quit vi, and discard any changes your have made since last saving:
  1. Press <Esc>.
  2. Type :q!
  3. Press <Return>.

Command Summary

STARTING vi
     vi filename    edit a file named "filename"
     vi newfile     create a new file named "newfile"
ENTERING TEXT
     i            insert text left of cursor
     a            append text right of cursor
MOVING THE CURSOR
     h            left one space
     j            down one line
     k            up one line
     l            right one space
BASIC EDITING
     x         delete character
     nx        delete n characters
     X         delete character before cursor
     dw        delete word
     ndw       delete n words
     dd        delete line
     ndd       delete n lines
     D         delete characters from cursor to end of line
     r         replace character under cursor
     cw        replace a word
     ncw       replace n words
     C         change text from cursor to end of line
     o         insert blank line below cursor
                  (ready for insertion)
     O         insert blank line above cursor
                  (ready for insertion)
     J         join succeeding line to current cursor line
     nJ        join n succeeding lines to current cursor line
     u         undo last change
     U         restore current line
MOVING AROUND IN A FILE
     w            forward word by word
     b            backward word by word
     $            to end of line
     0 (zero)     to beginning of line
     H            to top line of screen
     M            to middle line of screen
     L            to last line of screen
     G            to last line of file
     1G           to first line of file
     <Control>f   scroll forward one screen
     <Control>b   scroll backward one screen
     <Control>d   scroll down one-half screen
     <Control>u   scroll up one-half screen
     n            repeat last search in same direction
     N            repeat last search in opposite direction
CLOSING AND SAVING A FILE
     ZZ            save file and then quit
     :w            save file
     :q!            discard changes and quit file

Thứ Ba, 1 tháng 7, 2014

[Oracle cơ bản] Database Instance

Nội dung:
  • Giới thiệu Database Control, Enterprise Manger.
  • Tham số cấu hình hệ thống Initialization Parameters
  • Các trạng thái của database khi startup.
  • Các lựa chọn khi shutdown database.
  • Đề cập Alert log và Trace files.
  • Giới thiệu Dynamic performance views.
I - Giới thiệu Database Control, Enterprise Manger
Oracle Database cung cấp một giao diện quản lý độc lập (stand-alone management console) database gọi là Database Control. Mỗi database control chỉ quản lý 1 database duy nhất. Enterprise manager là một Web-based database control. Các câu lệnh liên quan đến enterprise manager
emctl status dbconsole
emctl start dbconsole
emctl stop dbconsole
Chú ý, để sử dụng những câu lệnh này, cần set biến môi trường, ở ví dụ của mình là "orcl"

Khi start enterprise manager lên, ta có thể truy cập vào giao diện web để xem. Đường dẫn có dạng
https://ip_server:port/em
Trong đó:
- ip_server là ip của server database
- port kết nối, mặc định là 1158 (nhớ mở kết nối iptables cho port này). Có thể cấu hình lại port này trong file $ORACLE_HOME/install/portlist.ini

II - Initialization Parameter Files
Initialization parameter file là file chứa những tham số cấu hình cho database. Những file dạng này sẽ được đọc khi start instance.

1. Phân biệt hai loại file cấu hình
  1. Server parameter file (SPFILE): Dạng file binary được đọc và ghi bởi server, chúng ta đừng nên đụng vào file này vì là dạng binary nên có đụng vào cũng không hiểu được ^^. SPFILE nằm trên server. Tên mặc định của file này có dạng "spfile<SID>.ora".
  2. Text initialization parameter file (PFILE): Dạng file này có thể được đọc bởi server, nhưng server không thể ghi được. PFILE là dạng text nên người thường có thể đọc được bằng mắt. PFILE vừa nằm trong server, vừa phải có 1 bản copy trên client. Dạng file "init<SID>.ora"
Tăng giá trị cho các tham số parameters có thể găng performance của hệ thống, tuy nhiên đòi hỏi tăng kích thước SGA.

Oracle tìm kiếm parameter file theo thứ tự
  1. Tìm file spfile<SID>.ora trong $ORACLE_HOME/dbs.
  2. Tìm file spfile.ora trong $ORACLE_HOME/dbs.
  3. Tìm file init<SID>.ora trong $ORACLE_HOME/dbs.
2. Phân biệt hai dạng của Initialization Parameter File
Có 2 dạng: basic và advance
Oracle khuyên rằng, trong phần lớn các trường hợp ta chỉ cần sửa 30 basic parameters để tăng performance cho database.
Một số ví dụ về basic parameters:
  • DB_NAME và DB_DOMAIN để xác định tên global của database.
  • Kích thước tổng cộng của SGA: SGA_TARGET.
Một số ví dụ về Initialization Parameters File
  • CONTROL_FILES: chỉ định số lượng control filenames cho database. Oracle đề nghị ít nhất có 2 control file cho mỗi database.
  • DB_FILES: chỉ định tối đa bao nhiêu database files được opened cho 1 database. Giá trị mặc định : 200.
  • PROCESSES: giới hạn số lượng tối đa user processes có thể đồng thời kết nối đến Oracle server. Giá trị mặc định: 100.
  • DB_BLOCK_SIZE: xác định kích thước (bytes) của 1 Oracle database block.
  • DB_CACHE_SIZE: xác định kích thước chuẩn của block buffer cache.
SGA_TARGET
Xác định tổng kích thước vùng SGA, bao gồm các thành phần con bên trong nó. Nếu cấu hình cho SGA_TARGET, thì vùng nhớ của các thành phần con bên trong cũng được tự động cấu hình theo, bao gồm:
  • Buffer cache (DB_CACHE_SIZE).
  • Shared pool (SHARED_POOL_SIZE).
  • Large pool (LARGE_POOL_SIZE).
  • Java pool (JAVA_POOL_SIZE).
  • Streams pool (STREAMS_POOL_SIZE).
3. Thay đổi giá trị trong Initialization Paramter
Chia làm 2 loại tham số: static parameters và dynamic parameters
1. Static parameters: Thay đổi static paramters đòi hỏi phải restart lại database để thay đổi có hiệu lực.
2. Dynamic parameters: Có thể thay đổi được ngay khi database đang chạy. Chia làm 2 loại
- Session-level parameters: chỉ ảnh hưởng trong 1 user session. Sẽ hết tác dụng khi kết thúc user session đó.
- System-level parameters: ảnh hưởng đến toàn bộ database và các session khác trong hệ thống.

4. Tầm vực giá trị trong Initialization Paramter
Giá trị tham số SCOPE áp dụng khi thay đổi static hay dynamic parameters:
  • SCOPE=SPFILE: chỉ thay đổi trên SPFILE. Và chỉ có hiệu lực lần startup tiếp theo của database. Chỉ áp dụng cho static parameters.
  • SCOPE=MEMORY: thay đổi áp dụng trên memory. Có hiệu lực ngay lập tức. Không áp dụng cho static parameters.
  • SCOPE=BOTH: thay đổi áp dụng cả trên SPFILE và memory. Đối với dynamic parameters sẽ có hiệu lực ngay lập tức và ngay cả lần startup tiếp theo của database do đã lưu trên SPFILE. Còn đối với static parameters thì chế độ này không được phép. (Vì static parameters không thể nào có hiệu lực ngay lập tức nên có lưu trên memory cũng vô tác dụng).
Ví dụ
ALTER SESSION SET NLS_DATE_FORMAT = 'mon dd yyyy';
ALTER SYSTEM SET SEC_MAX_FAILED_LOGIN_ATTEMPTS=2 COMMENT='Reduce from 10 for tighter security.' SCOPE=SPFILE;

III - Các trạng thái của database khi startup
Khi start database instance, có nhiều trạng thái để lựa chọn vị trí bắt đầu start: NOMOUNT, MOUNT, OPEN.

1. Chế độ NOMOUNT
Các công việc thực hiện trong chế độ NOMOUNT:
  • Tìm kiếm initialization parameter file theo thứ tự: kiếm spfile<SID>.ora đầu tiên, nếu không có kiếm spfile.ora, nếu không có nữa thì kiếm init<SID>.ora.
  • Cấp phát vùng nhớ SGA.
  • Start background processes.
  • Mở alert<SID>.log file và trace files.
2. Chế độ MOUNT
Các công việc thực hiện trong chế độ MOUNT:
  • Kế thừa trạng thái database ở chế độ NOMOUNT.
  • Xác định vị trí và open tất cả các control files xác định trong parameter file.
  • Đọc từ control files để lấy ra tên và trạng thái hoạt động của data files và online redo log files. Tuy nhiên, bước này không cần kiểm tra sự tồn tại thực sự của data files và online redo log files.
Một số trường hợp sử dụng chế độ MOUNT nhưng không cần OPEN database:
  • Rename data files.
  • Enable hoặc Disable online redo log file archiving.
  • Performing full database recovery.
3. Chế độ OPEN
Trạng thái hoạt động của database tức là instance được started và datase được mounted và opented để bất kì user hợp lệ nào cũng đều có thể kết nối được đến database.
Các công việc thực hiện trong chế độ OPEN:
  • Open data files
  • Open online redo log files
Trong bước cuối cùng này, Oracle server sẽ kiểm tra tất cả data files và online redo log files phải được opened và kiểm tra luôn tính nhất quán (consistency) của database. Nếu không đảm bảo điều kiện này, Oracle server sẽ văng lỗi trả về.


4. Ví dụ sử dụng sqlplus để start instance
Start instance, sau đó mount và open database
SQL> startup
Start instance và database ở chế độ NOMOUNT
SQL> startup nomount
Lệnh mount database từ trạng thái NOMOUNT
SQL> alter database mount;
Lệnh open database từ trạng thái MOUNT
SQL> alter database open;

Ngoài ra, khi cài đặt Oracle Restart, có thể sử dụng srvctl utility để start database instance. Ưu điểm khi dùng srvctl utility là nó có thể start tất cả các resource khác như ASM instance, ASM disk groups và listener.

IV - Các lựa chọn khi shutdown database
Có 4 chế độ shutdown:
  1. NORMAL: chờ đến khi tất cả session disconnect, là loại shutdown chậm nhất.
  2. TRANSACTIONAL: cho phép những transaction hiện tại kết thúc, nhưng không cho phép tạo mới transaction nữa.
  3. IMMEDIATE: loại thường được sử dụng nhất. Những transaction nào chưa commit sẽ bị roll back.
  4. ABORT: thực hiện ít công việc nhất có thể trước khi shutdown, là loại shutdown nhanh nhất. Khi sử dụng shutdown ABORT thì lần start tới sẽ đòi hỏi chạy instance recovery.

Quá trình shutdown ở các chế độ: NORMAL, TRANSACTIONAL, IMMEDIATE
1. NORMAL
Là chế độ mặc định (sử dụng SQL*PLUS) khi shutdown nếu không chỉ định cụ thể shutdown ở chế độ nào. NORMAL shutdown chỉ thực hiện trong những điều kiện sau:
  • Không tạo thêm connection mới.
  • Chờ cho tất cả users disconnect.
  • Database và redo buffers được ghi xuống disk.
  • Tắt background processes và thu hồi vùng nhớ của SGA.
  • Oracle server close và dismount database trước khi shutdown instance.
  • Lần start kế tiếp không cần instance recovery.
  • Bảo toàn tính toàn vẹn database.
2. TRANSACTION
Chế độ này đảm bảo dữ liệu của client không bị mất, chờ đến khi transaction của client hoàn thành. Thực hiện trong các điều kiện sau:
  • Không cho tạo mới transaction từ client.
  • Client sẽ bị disconnect khi kết thúc transaction.
  • Khi tất cả các transaction hoàn tất, thực hiện shutdown ngay lập tức.
  • Lần start kế tiếp không cần instance recovery.
  • Bảo toàn tính toàn vẹn database.
3. IMMEDIATE
Là chế độ default khi thực hiện shutdown trong Enterprise Manager.
Thực hiện trong điều kiện:
  • Những câu lệnh SQL nào đang chạy sẽ bị ngắt.
  • Oracle server không chờ user tự disconnect khỏi database.
  • Roll back tất cả transactions và disconnect tất cả users.
  • Close và dismount database trước khi shutdown instance.
  • Lần start kế tiếp không cần instance recovery.
  • Bảo toàn tính toàn vẹn database.
Quá trình shutdown ABORT
4. ABORT
Thực hiện trong các điều kiện:
  • Những câu lệnh SQL nào đang chạy sẽ bị ngắt.
  •  Oracle server không chờ user tự disconnect khỏi database.
  • Database và redo buffers không được ghi xuống disks.
  • Uncommitted transactions không được roll back.
  • Instance sẽ bị tắt mà không đóng lại các files.
  • Database không được closed và dismounted.
  • Lần start tiếp theo yêu cầu chế độ instance recovery. 
  • Không bảo toàn tính toàn vẹn của database.
V - Alert Log và Trace Files
Phần này chủ yếu nói về phần ghi log các tác động đến DB, hay các lỗi phát sinh khi server và background processes chạy.

VI - Dynamic Performace Views
Phần này đề cập 2 khái niệm về Dynamic Performance Views và Data Dictionary Views

1. Dynamic Performance Views
Là những bảng ảo lưu trữ trên memory structure của database, bắt đầu bằng từ khóa "v$", chứa thông tin vận hành và hiệu năng (performance) của database instance.
Dynamic performance views chứa các thông tin gồm:
  • Sessions
  • File states
  • Tiến trình
  • Locks
  • Backup status
  • Cấp phát và sử dụng memory
  • System và session parameters
  • SQL execution
Một số ví dụ về cách sử dụng dynamic performance views:
Lấy ra câu truy vấn nào có thời gian CPU thực hiện trên 200,000 microseconds
SQL> SELECT sql_text, executions FROM v$sql WHERE cpu_time > 200000;
Lấy ra các sessions IDs đang dữ lock
SQL> SELECT sid, ctime FROM v$lock WHERE block > 0;

2. Data Dictionary
Chứa thông tin metadata của database, bao gồm tên và thuộc tính của tất cả các objects trong database. Những thay đổi ảnh hưởng đến bất kì object nào trong database đều được update vào data dictionary.
Data dictionary dùng để:
  • Được Oracle database server dùng để tìm kiếm thông tin users, objects, constraints, lưu trữ.
  • Được vận hành bởi Oracle database server.
  • User có thể truy vấn thông tin về database thông qua các view truy xuất thông tin từ data dictionary.
  • Được sở hữu bởi user SYS.
  • Không nên chỉnh sửa trực tiếp thông qua câu SQL vào những thông tin của data dictionary.
Một số loại view chính trong Data dictionary
- Prefix DBA_ : được xem tất cả thông tin và  một số thông tin chỉ dành cho DBA, chỉ có người dùng có quyền DBA mới xem được.
- Prefix ALL_ : được xem tất cả thông tin objects mà user được cấp quyền xem, bất kể đối objects đó có thuộc sở hữu của user đó hay không.
- Prefix USER_ : có tầm vực nhỏ nhất, chỉ được xem thông tin những objects mà user sở hữu.

Một số ví dụ về truy vấn thông tin trong data dictionary view
Lấy thông tin table_name, tablespace_name trong shema đang sử dụng:
SELECT table_name, tablespace_name FROM user_tables;
Lấy thông tin các user có thể log in vào hệ thống:
SELECT username, account_status FROM dab_users WHERE account_status = 'OPEN';


Link tham khảo:

Thứ Hai, 30 tháng 6, 2014

[Oracle Database] Tự động Start hoặc Shutdown database instance

Mình làm trên công ty, máy server database cùi nên hay bị tắt giữa chừng. Mà mỗi lúc như vậy thì phải vào start listener rồi start database instance lên thấy mất công. Hôm nay post một bài mình tham khảo được về việc cấu hình tự động start 2 thứ đó lên cùng server, hoặc khi server shutdown thì nó tự động shutdown luôn.

Link tham khảo:

Đầu tiên, tạo thư mục chứa các script và cấp quyền sở hữu cho thư mục đó
mkdir -p /home/oracle/scripts
chown oracle.oracle/home/oracle/scripts 
Trong đó, user mình đang dùng là oracle, group là oracle luôn.
Dùng user root tạo file "/etc/init.d/dbora"
touch /etc/init.d/dbora
Sau đó chép đoạn nội dung này vào file vừa tạo
#!/bin/sh
# chkconfig: 345 99 10
# description: Oracle auto start-stop script.
#
# Set ORA_OWNER to the user id of the owner of the 
# Oracle database software.

ORA_OWNER=oracle

case "$1" in
    'start')
        # Start the Oracle databases:
        # The following command assumes that the oracle login 
        # will not prompt the user for any values
        # Remove "&" if you don't want startup as a background process.
        su $ORA_OWNER -c "/home/oracle/scripts/startup.sh >> /home/oracle/scripts/startup_shutdown.log 2>&1" &

        touch /var/lock/subsys/dbora
        ;;
    'stop')
        # Stop the Oracle databases:
        # The following command assumes that the oracle login 
        # will not prompt the user for any values
        su $ORA_OWNER -c "/home/oracle/scripts/shutdown.sh >> /home/oracle/scripts/startup_shutdown.log 2>&1"
        rm -f /var/lock/subsys/dbora
        ;;
esac

Trong đó ORA_OWNER là user linux sở hữu database, của mình là user oracle (đa phần là vậy).

Cấp quyền cho file vừa tạo

chmod 750 /etc/init.d/dbora

Cấu hình để chạy file tự động khi khởi động cùng server
chkconfig --add dbora

Tạo script startup
touch /home/oracle/scripts/startup.sh
Chép nội dung này vào file vừa tạo
#!/bin/bash 
 
# cấu hình biến môi trường, giống file .bash_profile của user oracle
PATH=$PATH:$HOME/bin
export PATH
export ORACLE_BASE=/home/oracle/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/dbhome_1
export NLS_LANG=american_america.al32utf8
export PATH=$ORACLE_HOME/bin:$PATH
export ORACLE_SID=orcl

ORAENV_ASK=NO
. oraenv
ORAENV_ASK=YES

# Start Listener
lsnrctl start

# Start Database
sqlplus / as sysdba << EOF
STARTUP;
EXIT;
EOF

Tạo script shutdown
touch /home/oracle/scripts/shutdown.sh
Chép nội dung này vào file vừa tạo
#!/bin/bash

# cấu hình biến môi trường, giống file .bash_profile của user oracle
PATH=$PATH:$HOME/bin
export PATH
export ORACLE_BASE=/home/oracle/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/dbhome_1
export NLS_LANG=american_america.al32utf8
export PATH=$ORACLE_HOME/bin:$PATH
export ORACLE_SID=orcl
 
ORAENV_ASK=NO
. oraenv
ORAENV_ASK=YES

# Stop Database
sqlplus / as sysdba << EOF
SHUTDOWN IMMEDIATE;
EXIT;
EOF

# Stop Listener
lsnrctl stop

Cấp quyền thực thi và quyền sở hữu 2 file này cho user oracle, group oracle
chmod u+x /home/oracle/scripts/startup.sh /home/oracle/scripts/shutdown.sh
chown oracle.oracle /home/oracle/scripts/startup.sh /home/oracle/scripts/shutdown.sh

Ok xong rồi, có thể test thử lại bằng lệnh sau
Start database instance
service dbora start
Stop database instance
service dbora stop

Hoặc reboot lại server sẽ thấy sau khi server reboot, database instance sẽ tự động start lên

Chúc vui !

Thứ Năm, 26 tháng 6, 2014

[Oracle cơ bản] Kiến trúc Oracle Database

Các nội dung chính:
  • Liệt kê các thành phần quan trọng trong Oracle Database.
  • Mô tả thành phần memory (memory structure).
  • Mô tả các tiến trình background processes.
  • Cấu trúc lưu trữ logic và vật lý.
  • Mô tả tổng quan các thành phần ASM.
I - Các thành phần trong Oracle Database
1. Oracle database gồm 3 thành phần chính
  1. Memory structure
  2. Process structure
  3. Storage structure
Kiến trúc tổng quan Oracle Database
Như hình trên, thì khái niệm Instance bao gồm 2 thành phần 1,2, còn khái niệm Database bao gồm thành phần thứ 3.
Mô hình quan hệ giữa Instance - Database
2. Mối liên hệ giữa Instance - Database
  • 1 instance kết nối đến 1 và chỉ 1 database duy nhất.
  • Trên 1 server có thể có nhiều database, mỗi database có 1 instance riêng (như mô hình Nonclustered System ở hình trên).
  • 1 database có thể có nhiều instance (mô hình Real Applications Cluster (RAC) như hình trên).
3. Luồng kết nối từ user đến instance
Mô hình kết nối user đến database instance
Phân biệt User processServer process
  • User process:"When a user runs an application program (such as a Pro*C program) or an Oracle tool (such as Oracle Enterprise Manager or SQL*Plus), Oracle Database creates a user process to run the user's application"
  • Server process: Oracle database tạo ra server process để xử lý những request của user process khi kết nối đến instance. Nếu user process và server process là cùng 1 máy, thì có thể gọp chung thành 1 process để giảm tải cho server. Nếu user process đến từ 1 máy khác server, thì Oracle database sẽ luôn luôn tạo ra 1 server process để phục vụ cho 1 user process khi kết nối đến.
Phân biệt connection và session
  • Connection: là kết nối thực sự từ user process đến instance (thông qua giao thức tcp/ip).
  • Session: là trạng thái hiện tại của user khi kết nối vào server, do server tạo ra (có thể là process hoặc thread), dựa trên connection kết nối tới. 1 session kéo dài từ lúc user đăng nhập đến khi log out khỏi hệ thống hoặc thời gian của session tồn tại đạt đến giá trị expire (hết hạn).
  • 1 user oracle có thể tạo ra nhiều session kết nối đến database từ nhiều máy khác nhau.
II - Memory structure
Mô hình memory structure
Mô hình memory structure
Một instance có 2 thành phần memory cơ bản:
  1. System Global Area (SGA)
  • Chứa dữ liệu (data) và thông tin điều khiển (control information) của 1 instance.
  • 1 SGA + n Processes = 1 Instance. Mỗi instance có phần SGA riêng.
     2.  Program Global Area (PGA):
  • Chứa dữ liệu và thông tin điều khiển cho từng server process hoặc background process - không chia sẻ giữa các server process hay background process với nhau.
  • 1 server process sẽ phục vụ cho những request từ 1 client. Khi start 1 server process sẽ cấp phát vùng nhớ PGA cho riêng server process đó. 
1. SGA: 
Gồm các thành phần chính như shared pool, data buffer cache, redo log buffer, large pool...
1.1. Shared pool
Là một thành phần quan trọng trong SGA, bao gồm những thành phần chính như Library Cache, Dictionary Cache, Result Cache.
Mô hình shared pool
Giá trị lưu trữ trong shared pool sẽ bị mất đi chỉ khi vùng nhớ cấp phát mới không đủ, cách hủy các giá trị cũ sẽ dựa vào thuật toán LRU (least recently used), căn bản của thuật toán này là, thèn nào ít dùng nhất sẽ bị loại bỏ.

1.1.1. Library cache
Bao gồm các thành phần như: private SQL areas, shared SQL areas, PL/SQL procedures và packages...
Thành phần private SQL areas và shared SQL areas:
  • Oracle ghi nhận việc thực hiện 1 câu lệnh SQL ở 2 thành phần: Shared SQL areas và private SQL areas (nằm trong vùng PGA - đến đây có thể đặt ra câu hỏi: shared pool thuộc SGA, library cache thuộc shared pool, trong library cache bao gồm shared và private SQL areas, vậy tại sao private SQL areas lại nằm trong PGA ? Câu trả lời được oracle giải thích tại đây, mình trích dẫn "The location of a private SQL area depends on the type of connection established for a session. If a session is connected through a dedicated server, private SQL areas are located in the server process's PGA. However, if a session is connected through a shared server, part of the private SQL area is kept in the SGA.").
  • Khi 1 user thực hiện 1 câu lệnh Oracle sẽ cấp phát vùng nhớ từ vùng shared pool. Nếu vùng shared pool đầy và không tìm thấy những vùng nhớ còn trống. Thì lúc này, oracle sẽ sử dụng thuộc toán LRU  để loại bỏ những thành phần ít được dùng nhất trong shared pool. Quá trình thực hiện 1 câu lệnh được lưu trữ trong cả private và shared SQL areas. Lưu vào vùng priavate SQL areas là đương nhiên rồi. Còn lưu vào shared SQL areas là để khi 2 users cùng thực hiện 1 câu lệnh, Oracle sẽ không chạy lại quá trình thực hiện câu lệnh đó nữa, mà vào thẳng vùng shared SQL areas để lấy luôn, giúp tiếc kiệm time & resource hệ thống.
  • Đối với PL/SQL procedures hay packages: Quá trình quản lý, cấp phát vùng nhớ cũng tương tự như khi thực hiện 1 câu lệnh statement.
1.1.2. Result cache
Một tính năng mới trong Oracle 11g. Result cache giúp lưu lại kết quả thực hiện của câu lệnh hoặc procedures/packages, nhằm tăng tốc độ cho câu truy vấn.

1.1.3. Data dictionary 
Một trong những thành phần quan trọng nhất trong Oracle database. Được sở hữu bởi user SYS trong hệ thống. Data dictionary bao gồm:
  • Định nghĩa tất cả các đối tượng scheme trong database như: views, tables, indexes, clusters, sequences, procedures, triggers, packages v.v...
  • Thông tin bộ nhớ chiếm dụng, đang sử dụng của các đối tượng shema.
  • Default value trong các cột.
  • Thông tin các ràng buộc (constraints).
  • Tên các users trong database.
  • Phân quyền và vai trò của các users trong database.
  • Thông tin về auditing như ai truy cập hay cập nhật các đối tượng schema.
Thông tin của data dictionary được lưu dưới dạng table và view (read-only), lưu trữ tại SYSTEM tablespace. Cấu trúc của data dictionary gồm 2 phần chính:
  • Basic tables: lưu trữ các thông tin liên quan về database. Những thông tin này được mã hóa và chỉ có Oracle mới được quyền thao tác dữ liệu trên đây.
  • User-Accessible views: những views chưa các thông tin từ basic table, nhưng được giải mã ra và đưa ra những thông tin cần thiết cho người dùng như các thông tin về table hay user trong hệ thống.
Dữ liệu của data dictionary phần lớn được lưu ở SGA, trong phần data dictionary cache. Lý do bởi vì Oracle database thường xuyên truy cập vào đây để lấy các thông tin về chứng thực người dùng, thông tin về tables hay các đối tượng trong schema khi nhận request từ client, cho nên việc lưu cache trong SGA giúp tăng performance hệ thống.
User bình thường, sử dụng các thông tin trong data dictionary thông qua các views. Một số prefix views chính trong data dictionary:
  • USER: chứa các thông tin về user. Ví dụ:
    # SELECT object_name, object_type FROM USER_OBJECTS;
  • ALL: các thông tin khác mà user có thể truy xuất. Ví dụ:
    # SELECT owner, object_name, object_type FROM ALL_OBJECTS; 
  • DBA: view dành cho quản trị database. Đối với prefix là DBA, muốn truy xuất cần chỉ định owners, ở đây chính là SYS. Ví dụ:
    # SELECT owner, object_name, object_type FROM SYS.DBA_OBJECTS; 
Tiện thể, ở đây mình giới thiệu 1 tí về dynamic performance tables. Khi gặp câu truy vấn mà nó có dạng "select <1 vài thứ gì đó> from V$_xxx". Thì cái v$ đó gọi là dynamic performance table, đây không phải là table thực sự, mà là table ảo lưu trữ những trạng thái hiện tại của database. Cái này thích thì tìm hiểu thêm, có nhiều cái thú vị để cấu hình cho database thông qua v$ này ^^.

1.2. Data buffer cache 
Cũng là 1 thành phần trong SGA như shared pool. Data buffer cache lưu trữ dữ liệu lấy từ datafile dưới database lên. Những dữ liệu này được lưu theo dạng block. Khái niệm buffer có thể được hiểu là 1 vùng trống trong data buffer cache có thể chứa hoặc không chứa dữ liệu.
Mô hình data buffer cache
Cấu trúc của data buffer cache:
  • Tổ chức thành 2 list: write list và the least recently used (LRU) list.
  • Write list: chứa những dirty buffers, tức là bao gồm những dữ liệu đã bị thay đổi (modified) nhưng chưa được lưu xuống database.
  • LRU list chứa free buffers (những vùng còn trống có thể lưu dữ liệu được), pinned buffers (những dữ liệu đang được truy xuất) và những dirty buffers chưa được đưa xuống write list.
Cơ chế hoạt động trong data buffer cache:
  • Khi có 1 process nào đó truy cập vào 1 buffer, buffer đó sẽ được đưa vào cuối LRU list. Mục đích là khi dọn dẹp data buffer cache theo thuật toán LRU, những buffer nằm ở top trên cùng của LRU list (tức là ít dùng đến nhất) sẽ bị bỏ đi.
  • Khi user process yêu cầu dữ liệu, đầu tiên hệ thống sẽ tìm kiếm trong data buffer cache, nếu tìm thấy (gọi là cache hit) sẽ gửi dữ liệu về cho user, nếu không tìm thấy (cache miss), hệ thống phải xuống dưới database, lấy dữ liệu từ datafile để đổ vào data buffer cache. Và tất nhiên là truy xuất dữ liệu từ cache hit nhanh hơn cache miss nhiều.
  • Trong trường hợp cache miss, trước khi đổ data block vào cache, process cần tìm ra free buffer trong cache. Quá trình tìm kiếm bắt đầu từ phía dưới LRU list tìm lên. Tìm kiếm kết thúc khi tìm thấy free buffer hoặc đạt tới ngưỡng tìm kiếm (không thể tìm thêm được nữa).
  • Nếu process tìm được dirty buffer trong LRU list, dirty buffer này sẽ được chuyển xuống write list, process tiếp tục tìm kiếm. Nếu process tìm được free buffer, thì data block sẽ được đưa vào đây, và buffer này được chuyển xuống cuối của LRU list.
  • Nếu process đạt tới ngưỡng tìm kiếm mà vẫn chưa tìm ra được free buffer. Thì lúc này, process sẽ ra hiệu cho DBW0 background process, là tiến trình giúp đưa những dirty buffer xuống đĩa cứng.
  • Chú ý: Nếu thực hiện full scan bảng, thì dữ liệu đọc từ datafile lên cache sẽ được đổ lên đầu (thay vì cuối) LRU list. Lý do là thèn Oracle nói rằng, full scan bảng là không nên, và nếu có dùng thì cũng chỉ trong 1 khoảng thời gian ngắn thôi. Nên dữ liệu của nó nên để lên đầu LRU list để được dọn dẹp sớm nhất có thể.
1.3. Redo log buffer
- Là một dạng circular buffer (hình dung nó là dạng vòng tròn, lưu trữ xoay vòng), lưu trữ tất cả những thông tin về việc tác động tới database. Những thông tin này lưu trữ trong redo entries.
Mô hình lưu trữ của redo log buffer
- Redo entries lưu thông tin về việc tác động vào database như: INSERT, UPDATE, DELETE, CREATE, ALTER, hay DROP. Mục đích nhằm phục hồi dữ liệu sau này (nếu cần).

1.4. Large pool 
Theo mình tự hiểu thì cái này do dba cấu hình memory cấp phát cho large pool. Mục đích dùng để chia sẽ memory cho phần shared pool khi thực hiện chạy các câu query yêu cầu memory lớn, hay dùng trong backup hệ thống. Tóm lại, như là một dạng memory dự trữ cho các phần khác khi cần.

2. PGA
Là vùng nhớ được cấp phát cho mỗi server process hoặc background process. PGA dùng để thực hiện những câu truy vấn, hoặc lưu trữ session. Tập hợp các PGAs gọi là 1 instance PGA. Kích thước của PGA instance này, thèn DBA có thể cấu hình để dễ quản lý. Cấu trúc PGA gồm 2 phần chính: Stack space và User Global Area (UGA).
Mô hình PGA

  1. Stack space: chứa các thông tin lưu trữ của session.
  2. UGA: với loại dedicated server, mỗi user connect vào database sẽ tạo ra 1 server process. Với loại này, PGA sẽ cấp phát 1 vùng nhớ gọi là UGA. Với loại shared server, nhiều client users chia sẻ chung server process. Trong loại này, UGA sẽ được chuyển vào trong SGA, lúc này vùng PGA chỉ còn stack space.
III - Process architecture
Thành phần thứ 2 cần tìm hiểu sau memory structure là process trong Oracle database.
Cấu trúc process

Process trong oracle chia làm 2 thành phần chính:
  1. User process.
  2. Oracle database process bao gồm server process và background process.
Mối liên hệ giữa user process và server process cũng khác nhau, tùy thuộc vào kiến trúc hệ thống (delicated server hay shared server) (đã giải thích ở những phần đầu blog).
Mô hình instance, trong đó có mối liên hệ user processes và Oracle processes
1. User processes
Khi người dùng sử dụng ứng dụng để kết nối đến Oracle database thì lúc này sẽ tạo ra 1 user process.

2. Server processes
-  Sinh ra là để phục vụ các request từ user process:
  •  Parse và thực hiện các câu truy vấn SQL nhận được từ ứng dụng.
  • Đọc các blocks dữ liệu từ ổ đĩa vào data buffer cache nếu như không tìm thấy dữ liệu cần tìm kiếm trên data buffer cache.
  • Trả kết quả về cho ứng dụng thực hiện truy vấn tương ứng.
-  User process muốn yêu cầu tạo ra server process phải thông qua listener process. Hay nói cách khác, listener là cấu nối để client kết nối được vào instance. Sau khi đã kết nối tạo ra session xong, thì listener không còn tác dụng với client đó nữa, có disable listener đi thì cũng không ảnh hưởng gì đến client đó.

3. Background processes
Thành phần giúp Oracle database quản lý bộ nhớ, đồng bộ dữ liệu xuống ổ cứng v.v..
Mô hình tổng quan hoạt động các process trong Oracle database
Một số background process chính
3.1. Database Writer Process (DBWn)

- Tiến trình thực hiện việc ghi những dirty buffers trong data buffer cache xuống ổ đĩa. Có thể cấu hình số lượng DBWn (DBW0, DBW1, DBW2 ...) để tăng performance hệ thống thông qua tham số DB_WRITER_PROCESSES (tối đa 20 processes).
- Khi 1 buffer trong data buffer cache bị chỉnh sửa (modified), nó được đánh dấu là dirty buffer. Cold buffer là khái niệm chỉ những buffer ít được dùng tới trong LRU list. DBWn sẽ ghi những dirty và cold buffer xuống đĩa cứng, nhờ đó user process có thể tìm thấy những clean và cold buffer để lưu những blocks dữ liệu mới vào trong data buffer cache. Nhờ có DBWn mà user processes luôn tìm được những buffer trống để lưu blocks dữ liệu mới.

3.2. Log Writer Process (LGWR)

- Thực hiện ghi tất cả các redo entries trong redo log buffer xuống redo log file (kể từ lần ghi gần nhất).
- Do redo log buffer là dạng circular buffer, cho nên, những redo entries nào đã được ghi xuống redo log file có thể được ghi đè lên bởi server process. Tốc độ LGWR đủ nhanh để đam bảo server process luôn ghi được vào redo entries.
- LGWR thực hiện việc ghi redo log buffer xuống redo log file trong các trường hợp:
  • Khi 1 user process commit 1 transaction.
  • Khi redo log buffer đầy 1/3.
  • Trước khi 1 DBWn thực hiện ghi buffer xuống ổ đĩa.
  • 3 giây thì ghi 1 lần.
- Khi user thực hiện lệnh commit 1 transaction, transaction này được gán 1 số SCN (system change number). Chỉ số SCN được ghi nhận vào redo log dùng khi thực hiện việc phục hồi trong hệ thống RAC hay distributed database.
- Trong trường hợp hệ thống cao tải, LGWR có thể ghi xuống redo log bằng hình thức group commits. Cụ thể, khi user commit 1 transaction, LGWR phải ghi redo entries của transaction đó xuống redo log file, trong thời gian đó, có thể có 1 user khác thực hiện commit 1 transaction khác. Bình thường, tại 1 thời điểm, LGWR chỉ có thể ghi xuống redo entries của 1 transaction. Muốn ghi redo entries của transaction kế tiếp phải chờ việc ghi redo entries transaction này kết thúc. Tuy nhiên, nếu số lượng commit tăng cao, thì tại 1 thời điểm, LGWR có thể ghi xuống nhiều redo entries của nhiều transactions.

3.3. Check point process (CKPT)
- 1 checkpoint là một cấu trúc dữ liệu dùng để định nghĩa chỉ số SCN dùng trong quá trình recovery của database. Checkpoint được lưu trong control file và header của data file.
- Khi xảy ra 1 check point, CKPT có nhiệm vụ cập nhật tất cả header của các data files.

3.4. Archiver Processes (ARCn)
- Khi 1 log switch xảy ra, ARCn tiến hành sao chép redo log file đến thiết bị lưu trữ (tạm gọi là quá trình archiving).
- ARCn chỉ chạy khi database bật chế độ ARCHIVELOG mode và thiết lập chế độ tự động thực hiện archiving.

IV - Database Storage Architecture

1. Các thành phần trong database storage
  1. Control files: chứa dữ liệu của database. Files này cực kỳ quan trọng đối với database. Không có control file, không thể truy xuất vào dữ liệu trong data files.
  2. Data files: chứa dữ liệu của user và của ứng dụng, cũng như dữ liệu metadata và data dictionary.
  3. Online redo log files: lưu trữ thông tin giúp việc recovery database. Cụ thể, nếu database bị crashes và không mất data files, thì instance có thể được recovery từ những thông tin lưu trữ trong files này.
  4. Parameter file: file cấu hình instance.
  5. Password file: cho phép user sử dụng quyền sysdba, sysoper và sysasm kết nối từ xa (remote) vào instance để thực hiện công việc quản trị hệ thống.
  6. Backup files: dùng cho recovery database.
  7. Archied redo log files: chứa tất cả dữ liệu mang tính lịch sử về những thay đổi đối với database. Từ files này cộng thêm một bản backup của database, chúng ta có thể lấy lại những dữ liệu bị mất của database.
  8. Trace files: Mỗi server và background process đều ghi nhận quá trình hoạt động vào trong trace files tương ứng, để khi lỗi phát sinh, sẽ được lưu trữ vào trace files.
  9. Alert log file: Là một dạng đặc biệt của trace file. Tóm lại là, khi databse bị lỗi, việc đầu tiên là chui vào đây xem có đứa nào (process) méc lại cho mình biết vì sao lỗi hay không.
2. Mối liên hệ giữa lưu trữ logic (logical) và vật lý (physical)
Mối quan hệ giữa Logical và Physical Storage
- Đơn vị lưu trữ nhỏ nhất trong Oracle database là Oracle data block. Mỗi Oracle data block tương ứng với con số cụ thể (ví dụ 2 bytes) của OS block.
- 1 extent gồm nhiều Oracle data block.
- 1 segment gồm nhiều extent.
- 1 tablespace gồm nhiều segment và có thể được lưu trữ trên nhiều data file.

V. Giới thiệu tổng quan về ASM (Automatic Storage Management)
ASM là một tính năng của Oracle, giúp cho việc quản lý, lưu trữ thông tin xuống disks dễ dàng. ASM và file system hoàn toàn có thể chạy song song với nhau. Khi ta tạo một database, có thể chỉ định hoặc trên ASM hoặc trên file system đều được.
1. Các thành phần trong ASM
Các thành phần trong ASM
- Oracle database file có mối quan hệ 1-1 với ASM file hay File system.
- 1 ASM disk group gồm nhiều ASM disk.
- 1 ASM disk gồm nhiều ASM allocation unit (AU), đơn vị nhỏ nhất mà ASM dùng để lưu trữ. Kích thước của AU có thể được cấu hình khi tạo ASM disk group.
- 1 ASM extent gồm nhiều ASM AU.
- 1 ASM file gồm nhiều ASM extent.

2. Tóm tắt lại luồng hoạt động tổng quan Oracle database

  1. Start instance.
  2. Người dùng mở ứng dụng để kết nối đến Oracle database (tạo ra user process).
  3. Listener trên server có nhiệm vụ tạo cầu nối để user process kết nối được với server thông qua server process.
  4. Người dùng thực hiện các câu lệnh SQL, sau đó commit transactions.
  5. Server process tiếp nhận các câu lệnh từ user process, tiếp theo kiểm tra xem trong vùng shared SQL area đã có câu lệnh này chưa, nếu có sẽ kiểm tra quyền truy xuất dữ liệu của user truy xuất và thực hiện truy xuất dữ liệu. Nếu chưa có, cấp phát 1 shared SQL area để câu lệnh có chỗ được parse và thực hiện.
  6. Server process sẽ lấy dữ liệu từ data buffer cache hoặc từ data file nếu không tìm thấy trong data buffer cache.
  7. Khi user commit transaction, tiến trình Log Writer (LGWR) ngay lập tức ghi dòng dữ liệu lưu trữ thông tin transaction đó trong redo entries xuống redo log file. Khi server process thay đổi (modified) dữ liệu trong data buffer cache thì tiến trình Database Writer (DBWn) sẽ ghi dirty buffers xuống data file trong trường hợp cần thiết.
  8. Transaction thực hiện thành công hay không, server process đều sẽ thông báo về ứng dụng truy cập vào database.
  9. Trong suốt luồng thực hiện này, những background process sẽ chạy để tiến hành hỗ trợ quá trình hoạt động của hệ thống.
Nhìn chung, phần này dừng lại ở mức giới thiệu tổng quan các khái niệm trong kiến trúc Oracle database. Những chi tiết khác có thể tìm hiểu sau dựa trên nền tảng này.

Link tham khảo:

Thứ Hai, 23 tháng 6, 2014

[Linux] Share thư mục từ Centos

Requirement:
- Máy server chạy Centos 6 & NGINX dĩ nhiên, cũng được cài trên đây.
- Máy dev dùng windows.
- Nay phát sinh nhu cầu muốn share thư mục /static của NGINX về máy windows để dev cho nó dễ.

Solution:
Bước 1: Cài đặt samba server trên centos 6
Kiểm tra server đã cài đặt samba server chưa:
# rpm -q samba
Nếu chưa thì tiến hành cài đặt:

# yum install samba samba-client samba-common
Cấu hình để samba server khởi động cùng server
# chkconfig smb on 
# chkconfig nmb on

Bước 2: Disable SElinux & Cấu hình iptables
# vi /etc/selinux/config
Đổi SELinux từ enforcing sang disabled
Cấu hình iptables
# iptables -I INPUT 4 -m state --state NEW -m udp -p udp --dport 137 -j ACCEPT
# iptables -I INPUT 5 -m state --state NEW -m udp -p udp --dport 138 -j ACCEPT
# iptables -I INPUT 6 -m state --state NEW -m tcp -p tcp --dport 139 -j ACCEPT
# service iptables save
Restart server (bước này mình chưa kiểm tra là không biết chỉ cần restart service iptables thì khỏi cần restart server hay không)

Bước 3: Kiểm tra workgroup của windows
Vào cmd windows (Ctrl + R -> cmd) gõ lệnh kiểm tra workgroup
# net config workstation
Tìm dòng: "Workstation domain", đây là workgroup của máy, tí nữa sẽ dùng để cấu hình trong samba config.

Bước 4: Chỉnh sửa file cấu hình samba
Trước tiên cần backup file cấu hình trước, rồi muốn phá gì phá ^^
# cp /etc/samba/smb.conf /etc/samba/smb.conf.bak
Chỉnh sửa file cấu hình 
# vi /etc/samba/smb.conf
Tìm từ khóa workgroup trong file cấu hình và gán giá trị bằng giá trị workgroup của máy đã tìm ở Bước 3.
Thêm vào phần cấu hình để trỏ đường dẫn đến thư mục cần share
#===== Cấu hình đến đường dẫn /tmp, user có thể sử dụng là user root ======== 
#===== Lưu ý: user ở đây phải là user của hệ thống
[tmp]
        path = /tmp
        writeable = yes
        browseable = yes
        valid users = demo

Bước 5: Cấu hình user đăng nhập samba
Thêm user vào cấu hình của samba server
# smbpasswd -a root
New SMB password:
Retype new SMB password:
Added user root. 
(Tham khảo thêm các lệnh quản lý user của samba tại đây)
Sau đó, restart server samba để cấu hình có hiệu lực

Vậy là xong, từ Windows, dùng explorer để truy xuất vào thư mục share này thông qua địa chỉ IP server.

Reference:

Nginx


Link tham khảo:







I -  Giới thiệu tổng quát NGINX
Theo wiki thì NGINX nó đảm nhiệm nhiều chức năng lắm: "Nginx (pronounced "engine-x") is an open source reverse proxy server for HTTP, HTTPS, SMTP, POP3, and IMAP protocols, as well as a load balancer, HTTP cache, and a web server (origin server)"
Tuy nhiên, do mình tìm hiểu NGINX để áp dụng vào dự án mình đang làm, cho nên theo mức độ hiểu biết của mình thì NGINX đóng vai trò như một vị trí "tiền tiêu". Tức là, nó đứng ra nhận các request trước, sau đó xử lý, xử lý ở đây cụ thể là, những request nào yêu cầu nội dung tĩnh (static) thì NGINX sẽ lấy trực tiếp những file cache đã lưu sẵn để trả về cho client, những request nào yêu cầu nội dung động (dynamic) thì sẽ forward request đó đến proxied server, sau đó nhận kết quả trả về từ proxied server rồi trả về cho client.
Kiến trúc NGINX (link tham khảo tại đây)
Đi sơ qua khái niệm NGINX để dễ hình dung. Dưới đây sẽ là phần cấu hình cụ thể NGINX.

II - Web Server
Khái niệm:
Trước tiên, cần tìm hiểu các khái niệm Directive Context. Trong NGINX, directive là khái niệm chỉ những từ khóa xác định các chỉ thị / lệnh cần thực hiện. Một số directives chính được gọi là Context: events, http, server, location. Những directives nào nằm ngoài các contexts trên được gọi là directives nằm trong main context.
Ví dụ về một full configuration trong nginx:
user nobody; # directive thuộc main context
events {
 #config cho events
}
http {
 #config cho http và cho tất cả các virtual servers (xem thêm bên dưới mục virtual server) bên trong nó
 server {
   #config cho virtual server 1
   location /one {
      #config xử lý URIs dạng '/one'
   }
   location /two {
      #config xử lý URIs dạng '/two'
   }
  }
  server {
    #config cho virtual server 2
  }
}
Virtual server:
- Để xử lý http request, cần ít nhất 1 virtual server
- Trong 1 http context có thể có nhiều virtual server.
- Trong 1 virtual server cần 1 directive listen để xác định IP address và Port cần lắng nghe.
- Ví dụ: virtual server sau sẽ lắng nghe địa chỉ 127.0.0.1 tại port 8080
server {
  listen 127.0.0.1:8080;
}
- Nếu thiếu port -> lắng nghe port standard (do mình cấu hình)
- Nếu thiếu address -> lắng nghe tất cả các địa chỉ address.
- Nếu thiếu listen directive:
 + Standard port: 80/tcp.
 + Default port: 8000/tcp.
- Nếu nhiều virtual server sử dụng chung IP và Port thì dựa vào directive server_name để xác định cần vào virtual server nào. (Ở đây mình chỉ đưa ra mức khái niệm, không nói sâu về mức server_name này).

Location: xác định bằng directive location
- Bên trong mỗi virtual server, có thể cấu hình nhiều dạng URIs có thể được điều hướng đến nhiều proxy hoặc lấy file từ file system.
- Tham số của location có thể là prefix string (mình tạm gọi tắt PS) hoặc regular expression (mình tạm gọi tắt RE) (đánh dấu bằng dấu ngã (~)).
- Để xử lý URI sẽ match theo PS hay RE thì luồng xử lý chỗ location này như sau:
  1. Dựa trên URI truyền vào, kiểm tra qua tất cả PS.
  2. Ký tự "=" dùng để mô tả cho PS. Nếu tìm thấy PS nào chính xác với URI và có ký tự "=" đứng trước thì quá trình tìm kiếm sẽ kết thúc.
  3. Ký tự "^~" cũng dùng để mô tả cho PS. Nếu tìm thấy PS nào có độ trùng dài nhất so với URI thì sẽ lấy PS đó và kết thúc tìm kiếm (không kiểm tra qua RE).
  4. Lưu lại PS nào có độ trùng dài nhất.
  5. Kiểm tra qua RE.
  6. Dừng lại ở RE nào đúng nhất được tìm thấy đầu tiên. Kết thúc tìm kiếm.
  7. Nếu không có RE nào thỏa mãn, lấy PS được lưu lại tại bước 4.
Ví dụ: Nếu URI "/" được truy suất nhiều (vào trang chủ), có thể cấu hình như sau để quá trình xử lý location nhanh nhất.
location = / {
 # config
}
Một ví dụ khác về cấu hình nhiều location trong 1 virtual server. Trong ví dụ bên dưới, tất cả URI không bắt đầu bằng /images/ sẽ được chuyển qua 1 proxy server (http://www.example.com.vn) nhớ directive proxy_pass. Những URI nào có dạng như "/images/example.png" sẽ được NGINX trả lại file "/data/images/example.png" nằm trên file system.
server {
 location / {
   proxy_pass http://www.example.com.vn;
 }
 location /images/ {
  root /data;
 }
}

III - Reverse Proxy
Chuyển 1 Request đến 1 Proxied Server
- NGINX chuyển request đến 1 proxied server, nhận lại response và gửi trả về cho client.
- NGINX hỗ trợ HTTP server và non-HTTP server.
- NGINX hỗ trợ các loại protocols sau: FastCGI, uwsgi, SCGI và memcached.
Ví dụ về việc chuyển 1 request đến 1 HTTP proxied server bằng proxy_pass directive:
localtion /some/path/ {
  proxy_pass http://www.example.com/link/;
}
Trong ví dụ trên, địa chỉ proxied server http://www.example.com theo sau bởi URI /link/. Điều này có nghĩa là nếu URI của proxeid server (ở ví dụ này là /link/) sẽ thay thế cho tham số URI của location (ở ví dụ này là /some/path/). Cho nên, nếu 1 request có dạng /some/path/page.html sẽ được chuyển thành http://www.example.com/link/page.html.
- Để chuyển đến 1 non-HTTP proxied server, NGINX sử dụng các directive tương ứng:
  • fastcgi_pass cho FastCGI server.
  • uwsgi_pass cho uwsgi server.
  • scgi_pass cho SCGI server.
  • memcached_pass cho memcached server.
III - NGINX Content Caching
Phần này hướng dẫn cách cấu hình caching (cache lại những responses từ những proxied servers) trong NGINX. Khi bật tính năng caching, NGINX sẽ lưu lại kết quả responses trên disk và sử dụng chúng để respond lại cho clients vào những lần sau mà không cần phải gửi request đến proxied server.
Bật tính năng cache
- Khai báo proxy_cache_path directive ở cấp http context. Sau đó, khai báo proxy_cache directive bên trong context muốn thực hiện cache. Ví dụ:
http {
  ...
  proxy_cache_path /data/nginx/cache keys_zone=one:10m;
  server {
    proxy_cache one;
    location / {
       proxy_pass http://localhost:8000;
    }
  }
}
- proxy_cache_path có 2 tham số bắt buộc:
  1. Đường dẫn file system nơi sẽ lưu responses. Trên ví dụ trên là "/data/nginx/cache".
  2. Tên và kích thước của vùng shared memory zone được xác định bởi từ khóa keys_zone. Trong ví dụ trên, tên vùng shared memory zone là "one", kích thước là 10m (One megabyte zone can store about 8 thousand keys - theo giải thích của NGINX). Tên vùng shared memory zone này cũng phải được chỉ định tại proxy_cache directive
- Kích thước của vùng lưu trữ cache response có thể được giới hạn bởi tham số max_size. Tuy nhiên, thông thường, kích thước của vùng lưu trữ này có thể vượt quá giới hạn tạm thời. Sau đó sẽ có một tiến trình gọi là cache manager process sẽ đi kiểm tra và loại bỏ những vùng cached responses ít dùng đến nhất.

Caching Processes
Có 2 loại NGINX process: cache loader và cache manager.
  1. Cache manager sẽ chạy định kì để xóa bớt những cached responses ít dùng nhất khi dung lượt vùng lưu trữ vượt quá max_size cho phép.
  2.  Cache loader chỉ active 1 lần duy nhất, ngay khi NGINX start. Tiến trình này sẽ load những thông tin metadata từ những lần cache dữ liệu trước đó vào vùng shared memory zone. Đặt điểm của process cache loader:
  • Phải load tất cả metadata 1 lần nên sẽ làm chậm hệ thống.
  • Do vậy, process sẽ chia làm nhiều lần (NGINX gọi là iteration) thực hiện và được cấu hình bởi tham số loader_threshold (đơn vị miliseconds), loader_files và loader_sleeps.
  • Loader_threshold là khoảng thời gian thực hiện tối đa của 1 iteration.
  • Loader_files là số lượng items tối đa (default là 100) cần load trong 1 iteration.
  • Loader_sleeps là thời gian dừng giữa 2 iteration.
Ví dụ về cấu hình proxy_cache_path:
proxy_cache_path /data/nginx/cache keys_zone=one:10m loader_threshold=300 loader_files=200;
Specifying Which Requests to Cache: cấu hình những request nào sẽ được cache
- Mặc định, NGINX sẽ cache tất cả các responses có phương thước GET và HEAD trong lần đầu tiên nhận được từ proxied server.
- NGINX phân biệt các request dựa vào các key (có thể cấu hình thông qua proxy_cache_key directive). Khi 2 request có cùng key, NGINX sẽ dùng cùng 1 cached response để gửi lại client.
- Có thể cấu hình số lượng request có key trùng nhau để bắt đầu cache (mặc định là 1), thông qua proxy_cache_min_uses directive.

Limiting or Bypassing Caching: giới hạn hoặc bỏ qua caching
- Mặc định, thời gian lưu trữ response là không giới hạn. Trừ khi tiến trình cache manager chạy và loại bỏ những response ít dùng nhất trong trường hợp vượt ngưỡng lưu trữ (cấu hình tham số max_size đã đề cập ở trên)
- Tuy nhiên, có thể cấu hình thời gian (tính bằng phút) lưu trữ response bằng proxy_cache_valid directive.
- Ngoài ra còn có cơ chế proxy_cache_bypassproxy_no_cache (có thể tự tìm hiểu thêm).

Restricting Access
Nginx cung cấp quản lý truy cập bằng 2 cách:
  • IP address
  • HTTP authentication
IP address
Sử dụng directive allow hoặc deny. Ví dụ:
location / {
  allow 192.168.1.1/24;
  deny all;
}

Authentication
Sử dụng directive auth_basic auth_basic_user_file. Ví dụ:
location / {
  auth_basic "closed website";
  auth_basic_user_file /etc/nginx/authfile;
}
Trong đó /etc/nginx/authfile là file chứa username/password chứng thực. Tạo authfile thông qua lệnh htpasswd.
cd /etc/nginx
htpasswd -c -m authfile <username>
Chú ý, nhớ set lại quyền cho file authfile để thực hiện được.

Sau khi cài đặt xong, muốn truy xuất file của nginx, cần phải nhập username / password.
Ví dụ, mình có file test.txt nằm trong thư mục nginx (địa chỉ 192.168.1.69). Username/password = usertest/123456, dùng để chứng thực khi truy xuất file. Có  3 cách truy xuất:
1. Trên trình duyệt, nhập địa chỉ: http://192.168.1.69/test.txt
Lúc này browser sẽ hiện ra khung nhập username/password.
2. Truyền tham số trực tiếp trên trình duyệt như sau: http://usertest:123456@192.168.1.69/test.txt
3. Sử dụng code java (ưu điểm là encode được username/password khi truyền).
public static void main(String[] args) throws ClientProtocolException,
            IOException {
        String USER_AGENT = "Mozilla/5.0";
        String url = "http://10.30.174.211:9069/sabeco/donatest/donatestnginx.txt";

        HttpClient client = HttpClientBuilder.create().build();
        HttpGet request = new HttpGet(url);

        // add request header
        String encoding = new String(
                org.apache.commons.codec.binary.Base64
                        .encodeBase64(org.apache.commons.codec.binary.StringUtils
                                .getBytesUtf8("nginxtestuser:123456")));
        request.addHeader("Authorization", "Basic " + encoding);
        HttpResponse response = client.execute(request);

        System.out.println("Response Code : "
                + response.getStatusLine().getStatusCode());

        BufferedReader rd = new BufferedReader(new InputStreamReader(response
                .getEntity().getContent()));

        StringBuffer result = new StringBuffer();
        String line = "";
        while ((line = rd.readLine()) != null) {
            result.append(line);
        }
        System.out.println(result.toString());
    }