DBA 數(shù)據(jù)庫管理員
- 小公司 - 不設置專職DBA
- 大公司 - 專職DBA:維護數(shù)據(jù)庫穩(wěn)定,解決請求變慢,數(shù)據(jù)丟失,安全等問題合武。
- DBA -> 業(yè)務架構(gòu)師
- DBA -> 運維專家
- DBA -> 數(shù)據(jù)庫研發(fā)
DBA 工作職責
- 基礎運維
- 安裝部署
- 監(jiān)控
- 故障處理
- 安全運維
- 數(shù)據(jù)備份與恢復
- 安全訪問、安全漏洞
- 審計
- 性能調(diào)優(yōu)
- 數(shù)據(jù)庫優(yōu)化
- 容量評估涡扼、軟硬件升級
- 開發(fā)支持
- 存儲方案制定
- 數(shù)據(jù)庫設計
- 數(shù)據(jù)庫變更稼跳、SQL Review
- 流程與培訓
- 數(shù)據(jù)庫開發(fā)規(guī)范
- 運維流程標準化
- 業(yè)務培訓
滿足互聯(lián)網(wǎng)業(yè)務的嚴格要求:
- 高性能(數(shù)據(jù)庫 很重要)
- 高可用(業(yè)務運行不中斷)
- 可擴展(數(shù)據(jù)庫拓展 支撐海量數(shù)據(jù)和業(yè)務)
- 安全性(敏感 核心業(yè)務數(shù)據(jù))
- 數(shù)據(jù)備份(amazon為防止黑客攻擊或硬盤損壞,每天增量備份吃沪,隔幾天全備份)
DBA 專業(yè)技能
- 數(shù)據(jù)庫原理
- Linux與Shell
- 計算機體系結(jié)構(gòu)
- 網(wǎng)絡原理
- 數(shù)據(jù)庫系統(tǒng)與操作
- 服務器硬件
- 業(yè)務架構(gòu)設計
數(shù)據(jù)庫 基本知識
數(shù)據(jù)庫分類:
關(guān)系型數(shù)據(jù)庫SQL:oracle MySQL
非關(guān)系型數(shù)據(jù)庫NoSQL(Not only sql):mongodb redis memcached
MySQL是C/S架構(gòu)的軟件:
服務器 mysqld
客戶端
庫-表-行
數(shù)據(jù)庫服務器 可以管理n個庫,每個庫有n個表,表里是一行行的數(shù)據(jù)
CRUD:增加(Create)汤善、讀取查詢(Retrieve)、更新(Update) 刪除(Delete)
增 增加一行記錄
刪 刪除一行票彪。刪除最小單位為“行”萎津,不能單獨把某一具體行的某一列刪除(只能 修改為null)
改
查
SQL( Structured Query Language)結(jié)構(gòu)化查詢語言
數(shù)據(jù)庫管理系統(tǒng)通過 SQL 語言來管理數(shù)據(jù)庫中的數(shù)據(jù)。
SQL語句的分類 | 大致用途 |
---|---|
DDL(Data Definition Language) | 數(shù)據(jù)定義語言:創(chuàng)建庫/表抹镊,刪除表锉屈,修改表…… |
DML(Data Manipulation Language) | 數(shù)據(jù)操作語言:向表中插入記錄,修改或者刪除表中的記錄…… |
select | 根據(jù)條件從表中查詢出想要得到的記錄 |
DCL(Data Control Language) | 數(shù)據(jù)控制語言:控制數(shù)據(jù)庫的(用戶)訪問權(quán)限等 |
TCL(Transaction Control Language) | 控制事務進展 |
- DDL
- CREATE TABLE
- DROP TABLE
- ALTER TABLE
- DML
- SELECT FROM TABLE【最頻繁】
- INSERT INTO TABLE
- UPDATE TABLE SET
- DELETE FROM TABLE
- DCL
- GRANT
- REVOKE
- TCL
- COMMIT
- ROLLBACK
linux安裝數(shù)據(jù)庫
# 下載安裝數(shù)據(jù)庫服務器
sudo apt-get install mysql-server-5.6
# 啟動MySQL服務 2種方法
sudo /etc/init.d/mysql start
sudo service mysql start
# 停止MySQL服務 2種方法
sudo /etc/init.d/mysql stop
sudo service mysql stop
# 重啟
sudo service mysql restart
# 查看狀態(tài)
sudo /etc/init.d/mysql status
windows安裝數(shù)據(jù)庫服務器:自定義安裝垮耳, 把 數(shù)據(jù) 程序 分開放在兩個文件夾
連接過程
任何滿足mysql通信規(guī)范的軟件都可以作為客戶端來連接服務器颈渊。
常用的客戶端:
命令行客戶端(mysql自帶)
navicat(圖形化)
phpMyAdmin(web)
1.運行服務器端
windows啟動服務進程mysqld.exe
2.運行客戶端
在mysql\bin目錄運行mysql.exe
或配置環(huán)境變量用cmd輸入mysql.exe運行
3.連接 - 方式1 - 使用Socket連接(本地連接)
# 需要指定參數(shù):socket文件(文件權(quán)限必須是777) 用戶名 密碼( -p回車后 再輸入密碼更安全)
mysql -S/tmp/mysql.sock -uroot -p
#socket一般存儲路徑為:/tmp/mysql.sock
# 如果找不到文件可先進行tcp連接 然后通過如下命令查找
show global variables like 'socket';
3.連接 - 方式2 - 使用命令行(TCP/IP遠程連接)MySQL服務器
客戶端發(fā)送SQL指令
mysql -hlocalhost -P3306 -uroot -p
#回車 輸入密碼 登錄驗證
#DBA運維管理工具大多使用高效的命令行方式:多臺機器可以同時操作
#MySQL命令行里有豐富的擴展參數(shù) -h省略即localhost -u root可寫成-uroot
#遠程連接時要指定IP和端口
4.連接成功 - 執(zhí)行語句
服務器端接收到SQL指令-處理指令-返回結(jié)果
客戶端收到結(jié)果-顯示結(jié)果
status;
# 打印數(shù)據(jù)庫狀態(tài) :服務器編碼 數(shù)據(jù)庫編碼 客戶端編碼
#每條語句后 跟分號;或者\g 回車執(zhí)行 否則報1064:SQL syntax錯誤
#語句中沒有分號 則可用 \c主動取消本語句的執(zhí)行(即什么都不執(zhí)行)
mysql> select 222\c
# 如果\c之前有分號遂黍,則語句依然執(zhí)行!
mysql> select 1;\c
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (0.00 sec)
show processlist;
# 展示當前連接
\q
quit;
exit;
#斷開連接 釋放服務器資源
有密碼且已登錄 這樣改密碼:
方法1: UPDATE直接編輯user表
use mysql;
update user set password=password("newpass") where user='root' and host='localhost';
flush previliges;
方法2: SET PASSWORD命令
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpass');
flush previliges;
有密碼但未登錄 改密碼:
windowes下cmd進入這個目錄執(zhí)行MySQL\bin>
mysqladmin -u root -p老密碼 password "pass"
本來為空密碼 設置密碼
mysqladmin -u root password "newpass"
丟失root密碼 重置密碼:
以安全模式啟動mysql俊嗽,這樣不需要密碼可以直接以root身份登錄雾家,然后重設密碼。
停掉MySQL服務 關(guān)閉正在運行的MySQL
Ubuntu和Debian下:
sudo service mysql stop
CentOS绍豁、RHEL芯咧、Fedora下:
sudo service mysqld stop
以安全模式啟動mysql
sudo mysqld_safe --skip-grant-tables --skip-networking &
--skip-networking是避免其他人遠程無密碼登錄MySQL。
直接用root登錄竹揍,無需密碼:
mysql -u root
設密碼:
mysql> use mysql;
mysql> update user set password=PASSWORD("mynewpassword") where User='root';
mysql> flush privileges;
mysql > quit
quit不需要分號敬飒。
重啟服務:
sudo service mysql restart #Ubuntu和Debian下
sudo service mysqld restart #CentOS、RHEL芬位、Fedora下
用新密碼登錄:
mysql -u root -pnewpass
-p和密碼間不能有空格阔馋。
windwos下重置root密碼
cmd命令
cd 到mysqlbin目錄
輸入命令
mysqld --skip-grant-tables
如果沒有出現(xiàn)提示信息引谜,就對了
再開一個DOS窗口(因為剛才那個DOS窗口已經(jīng)不能動了),轉(zhuǎn)到mysqlbin目錄惨缆。
輸入mysql
將出現(xiàn)MySQL提示符 >
連接權(quán)限數(shù)據(jù)庫>use mysql;
改密碼:> update user set password=password("123456") where user="root";
刷新權(quán)限(必須的步驟)>flush privileges;
退出 >q
關(guān)閉所有mysql程序和服務
重新打開用新的root密碼登錄
僅支持Ubuntu和Debian重置root密碼的方案:
在Ubuntu和Debian系統(tǒng)中有一個debian-sys-maint用戶讶坯,Debian類系統(tǒng)下一些系統(tǒng)腳本對mysql的操作是通過這個用戶完成的旭斥。所以我們可以通過這個用戶來修改root密碼彩掐。用戶的密碼可以在/etc/mysql/debian.cnf下找到:
# Automatically generated for Debian scripts. DO NOT TOUCH!
[client]
host = localhost
user = debian-sys-maint
password = PASSWORD
socket = /var/run/mysqld/mysqld.sock
[mysql_upgrade]
host = localhost
user = debian-sys-maint
password = PASSWORD
socket = /var/run/mysqld/mysqld.sock
basedir = /usr
用該用戶登錄mysql后铭若,可以修改密碼:
sudo mysql -u debian-sys-maint -p
查看幫助
#按照層次查看幫助
? contents
? data types #繼續(xù)查看某一具體category (如查看mysql支持的數(shù)據(jù)類型data types)
? INT #繼續(xù)查看 更具體的介紹
#按關(guān)鍵字 快速查閱幫助
? show #查看show命令都能看什么東西
? create table #查看建表的語法
mysql> ? create table
Name: 'CREATE TABLE'
Description:
Syntax:
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
(create_definition,...)
[table_options]
[partition_options]
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
[(create_definition,...)]
[table_options]
[partition_options]
select_statement
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
{ LIKE old_tbl_name | (LIKE old_tbl_name) }
create_definition:
col_name column_definition
| [CONSTRAINT [symbol]] PRIMARY KEY [index_type] (index_col_name,...)
[index_option] ...
| {INDEX|KEY} [index_name] [index_type] (index_col_name,...)
[index_option] ...
| [CONSTRAINT [symbol]] UNIQUE [INDEX|KEY]
[index_name] [index_type] (index_col_name,...)
[index_option] ...
| {FULLTEXT|SPATIAL} [INDEX|KEY] [index_name] (index_col_name,...)
[index_option] ...
| [CONSTRAINT [symbol]] FOREIGN KEY
[index_name] (index_col_name,...) reference_definition
| CHECK (expr)
column_definition:
data_type [NOT NULL | NULL] [DEFAULT default_value]
[AUTO_INCREMENT] [UNIQUE [KEY] | [PRIMARY] KEY]
[COMMENT 'string']
[COLUMN_FORMAT {FIXED|DYNAMIC|DEFAULT}]
[STORAGE {DISK|MEMORY|DEFAULT}]
[reference_definition]
data_type:
BIT[(length)]
| TINYINT[(length)] [UNSIGNED] [ZEROFILL]
| SMALLINT[(length)] [UNSIGNED] [ZEROFILL]
| MEDIUMINT[(length)] [UNSIGNED] [ZEROFILL]
| INT[(length)] [UNSIGNED] [ZEROFILL]
| INTEGER[(length)] [UNSIGNED] [ZEROFILL]
| BIGINT[(length)] [UNSIGNED] [ZEROFILL]
| REAL[(length,decimals)] [UNSIGNED] [ZEROFILL]
| DOUBLE[(length,decimals)] [UNSIGNED] [ZEROFILL]
| FLOAT[(length,decimals)] [UNSIGNED] [ZEROFILL]
| DECIMAL[(length[,decimals])] [UNSIGNED] [ZEROFILL]
| NUMERIC[(length[,decimals])] [UNSIGNED] [ZEROFILL]
| DATE
| TIME
| TIMESTAMP
| DATETIME
| YEAR
| CHAR[(length)] [BINARY]
[CHARACTER SET charset_name] [COLLATE collation_name]
| VARCHAR(length) [BINARY]
[CHARACTER SET charset_name] [COLLATE collation_name]
| BINARY[(length)]
| VARBINARY(length)
| TINYBLOB
| BLOB
| MEDIUMBLOB
| LONGBLOB
| TINYTEXT [BINARY]
[CHARACTER SET charset_name] [COLLATE collation_name]
| TEXT [BINARY]
[CHARACTER SET charset_name] [COLLATE collation_name]
| MEDIUMTEXT [BINARY]
[CHARACTER SET charset_name] [COLLATE collation_name]
| LONGTEXT [BINARY]
[CHARACTER SET charset_name] [COLLATE collation_name]
| ENUM(value1,value2,value3,...)
[CHARACTER SET charset_name] [COLLATE collation_name]
| SET(value1,value2,value3,...)
[CHARACTER SET charset_name] [COLLATE collation_name]
| spatial_type
index_col_name:
col_name [(length)] [ASC | DESC]
index_type:
USING {BTREE | HASH}
index_option:
KEY_BLOCK_SIZE [=] value
| index_type
| WITH PARSER parser_name
| COMMENT 'string'
reference_definition:
REFERENCES tbl_name (index_col_name,...)
[MATCH FULL | MATCH PARTIAL | MATCH SIMPLE]
[ON DELETE reference_option]
[ON UPDATE reference_option]
reference_option:
RESTRICT | CASCADE | SET NULL | NO ACTION
table_options:
table_option [[,] table_option] ...
table_option:
ENGINE [=] engine_name
| AUTO_INCREMENT [=] value
| AVG_ROW_LENGTH [=] value
| [DEFAULT] CHARACTER SET [=] charset_name
| CHECKSUM [=] {0 | 1}
| [DEFAULT] COLLATE [=] collation_name
| COMMENT [=] 'string'
| CONNECTION [=] 'connect_string'
| DATA DIRECTORY [=] 'absolute path to directory'
| DELAY_KEY_WRITE [=] {0 | 1}
| INDEX DIRECTORY [=] 'absolute path to directory'
| INSERT_METHOD [=] { NO | FIRST | LAST }
| KEY_BLOCK_SIZE [=] value
| MAX_ROWS [=] value
| MIN_ROWS [=] value
| PACK_KEYS [=] {0 | 1 | DEFAULT}
| PASSWORD [=] 'string'
| ROW_FORMAT [=] {DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT}
| TABLESPACE tablespace_name [STORAGE {DISK|MEMORY|DEFAULT}]
| UNION [=] (tbl_name[,tbl_name]...)
partition_options:
PARTITION BY
{ [LINEAR] HASH(expr)
| [LINEAR] KEY [ALGORITHM={1|2}] (column_list)
| RANGE{(expr) | COLUMNS(column_list)}
| LIST{(expr) | COLUMNS(column_list)} }
[PARTITIONS num]
[SUBPARTITION BY
{ [LINEAR] HASH(expr)
| [LINEAR] KEY [ALGORITHM={1|2}] (column_list) }
[SUBPARTITIONS num]
]
[(partition_definition [, partition_definition] ...)]
partition_definition:
PARTITION partition_name
[VALUES
{LESS THAN {(expr | value_list) | MAXVALUE}
|
IN (value_list)}]
[[STORAGE] ENGINE [=] engine_name]
[COMMENT [=] 'comment_text' ]
[DATA DIRECTORY [=] 'data_dir']
[INDEX DIRECTORY [=] 'index_dir']
[MAX_ROWS [=] max_number_of_rows]
[MIN_ROWS [=] min_number_of_rows]
[TABLESPACE [=] tablespace_name]
[NODEGROUP [=] node_group_id]
[(subpartition_definition [, subpartition_definition] ...)]
subpartition_definition:
SUBPARTITION logical_name
[[STORAGE] ENGINE [=] engine_name]
[COMMENT [=] 'comment_text' ]
[DATA DIRECTORY [=] 'data_dir']
[INDEX DIRECTORY [=] 'index_dir']
[MAX_ROWS [=] max_number_of_rows]
[MIN_ROWS [=] min_number_of_rows]
[TABLESPACE [=] tablespace_name]
[NODEGROUP [=] node_group_id]
select_statement:
[IGNORE | REPLACE] [AS] SELECT ... (Some valid select statement)
CREATE TABLE creates a table with the given name. You must have the
CREATE privilege for the table.
Rules for permissible table names are given in
http://dev.mysql.com/doc/refman/5.5/en/identifiers.html. By default,
the table is created in the default database, using the InnoDB storage
engine. An error occurs if the table exists, if there is no default
database, or if the database does not exist.
URL: http://dev.mysql.com/doc/refman/5.5/en/create-table.html
基本操作-庫
mysql> show databases; #當前數(shù)據(jù)庫服務器有哪些數(shù)據(jù)庫
mysql> create database php; #創(chuàng)建1個名為php的數(shù)據(jù)庫
mysql> use php #選中1個數(shù)據(jù)庫(這條語句末尾可以不加分號)
mysql> show tables; #查看php庫內(nèi)有什么表:空表就回顯Empty set
mysql> drop databese test; #刪除test數(shù)據(jù)庫
mysql本身并沒有提供[修改數(shù)據(jù)庫名]的方法!狭握!不能修改數(shù)據(jù)庫名箭养!
基本操作-表
在php庫下創(chuàng)建表:
mysql> use php
mysql> create table stu (
id int,
name varchar(20),
age int,
area varchar(20)
);
CREATE TABLE 表名
(
列名a 數(shù)據(jù)類型(數(shù)據(jù)長度),
列名b 數(shù)據(jù)類型(數(shù)據(jù)長度),
列名c 數(shù)據(jù)類型(數(shù)據(jù)長度)
);
修改表:
所有的數(shù)據(jù)表的修改SQL語句 開頭都是ALTER TABLE+表名
重命名表:
ALTER TABLE tb_name RENAME {TO|AS} tb_new_name;
mysql> rename table tb_name to tb_new_name; #批量修改多個表的名稱
盡量不要隨意修改表的名稱哥牍。對視圖有影響
表中新增(ADD)列:
ALTER TABLE tb_name ADD [COLUMN] col_name column_definition [FIRST|AFTER col_name];
列 即 字段
不指定 FIRST|AFTER col_name 時,新增字段默認會插入到表的最下面
字段定義后可指定FIRST,則新增字段置于最上面;
也可在字段定義后指定AFTER col_name
則新增字段置于col_name
之下
表中丟棄(DROP)列:
ALTER TABLE tb_name DROP col_name1,DROP col_name2; #可一次性刪除多個列
修改表中列:
修改列定義 即修改列的屬性喝检。
ALTER TABLE tb_name MODIFY col_name column_definition [FIRST|AFTER col_name];
比如:
ALTER TABLE test ADD id SMALLINT unsigned KEY auto_increment first;
key 表示主鍵(無需primary) 如果要修改的列已經(jīng)是主鍵
了嗅辣,則修改列定義的時候再加上主鍵
字段會報錯
first 讓本字段成為本表的第一個字段。
主鍵:表中的一個或多個字段挠说,它的值用于唯一地標識表中的某一條記錄澡谭。
修改列名:
ALTER TABLE tb_name CHANGE col_name col_new_name column_definition [FIRST|AFTER col_name];
修改列名時,新列名后面要有列定義(數(shù)據(jù)類型)
修改列順序:
其實同上损俭,比如:
#把join_time列放到role列后面
ALTER TABLE `user` CHANGE `join_time` `join_time` DATE NULL DEFAULT NULL AFTER `role`;
修改約束
添加主鍵約束
PRIMARY KEY
ALTER TABLE tb_name ADD [CONSTRAIN[symbol]] PRIMARY KEY [index.type] (index_col_name,.....);
刪除主鍵約束
ALTER TABLE tb_name DROP [index.type] PRIMARY KEY;
不需要指定列名蛙奖,因為每個表只有一個主鍵(注意!不意味著主鍵只有一列)
添加唯一約束
UNIQUE
ALTER TABLE tb_name ADD [index.type] unique(col_name);
刪除唯一約束
ALTER TABLE tb_name DROP [index.type] unique(col_name);
DEFAULT
ALTER TABLE tb_name ALTER [COLUMN] col_name {SET DEFAULT literal|DROP DEFAULT};
for example:
ALTER TABLE users ALTER age SET DEFAULT 20;
添加外鍵約束
FOREIGN KEY
ALTER TABLE tb_name ADD [CONSTRAIN[symbol]] FOREIGN KEY [index_name](index_col_name,...)reference_definition;
for example:
ALTER TABLE users add FOREIGN KEY (pid) REFERENCE provinces (id);
刪除外鍵約束
ALTER TABLE tb_name DROP FOREIGN KEY fk_symbol;
刪除表:
mysql> drop table newstu;
表的描述
desc 表名; #可查看到該表的字段信息,低版本好像可以用description代替desc
如
desc newstu;
回顯一個表的
字段名 字段數(shù)據(jù)類型 是否可空
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
基本操作-行
注意編碼 字符集
我們配置mysql建表用UTF-8編碼杆兵,而win下的窗口是gbk編碼(如cmd)
操作數(shù)據(jù)時要 聲明[客戶端]正在使用的字符集!
mysql> set names gbk; #聲明[客戶端]使用的是GBK字符集
新增一條記錄
新增一行數(shù)據(jù)
#不指定插入字段名稱時 values后的值要和[字段的順序]一致
insert into newstu (id,name) values(3,'張三');
#指定插入的字段名稱為 id,name時
這些字段可以不寫在[字段列表]:可空字段雁仲、非空且有默認值的字段、自增字段
(插入新記錄即自動設置為: NULL 默認值 自增到相應數(shù)字)
insert into newstu (id,name) values(3,'張三');
插入 多條記錄
插入 多行數(shù)據(jù)
insert into newstu (id,name) values (3,"張三"),(4,"李斯"),(5,"王五");
查看表中[所有行] 的 [所有列]
select * from newstu;
查看表中[所有行] 的 部分列
select id from newstu;
select id,name from newstu;
查看表中 部分行 的 [所有列]
select * from newstu where id>1; --id大于1的那些行
查看表中 部分行 的 部分列
select id,name from newstu where id>1;
修改/更新 表中某一條記錄
update newstu set id=1,name = "張飛" where name="張三";
更新 表中[所有記錄]
update newstu set id=1,name = "張飛";
新增一個字段
一次只能增加一個字段
表中已有的記錄琐脏,這一新增字段會自動賦值為null
alter table stu add age2 tinyint unsigned; #被聲明為tinyint unsigned的字段age2的存儲值范圍是0-255
#改變表stu [增加1個列age2] 無符號型
刪除 表中[所有記錄]
delete from stu; #新手模式下delete語句必須加where子句攒砖。否則delete語句不會執(zhí)行缸兔。
delete from stu where id=2; #刪除id為2的那些行
mysql 注釋
注釋符"--"后面至少跟一個空白符(例如空格、tab吹艇、換行符 等)
這樣才可以"-- "
mysql 服務器支持的注釋符有3種:
# 到該行結(jié)束 單行注釋
-- 到該行結(jié)束 單行注釋
/* 行中間或多個行 多行注釋 */
mysql> SELECT 1+1; # 這個注釋直到該行結(jié)束
mysql> SELECT 1+1; -- 這個注釋直到該行結(jié)束
mysql> SELECT 1 /* 這是一個在行中間的注釋 */ + 1;
mysql> SELECT 1+
/*
這是一個多行注釋的形式
*/
1;
[注意]
-- (雙長劃) 注釋風格要求在兩個長劃后至少有一個空白符!(例如空格惰蜜、tab、換行符 等)
盡管服務器理解剛才描述的注釋句法受神,但 MySQL 客戶端的語法分析在 /* ... */ 注釋方式上還有所限制:
單引號和雙引號被用來標志一個被引用字符串的開始抛猖,即使是在一個注釋中也是這樣的。
所以 如果注釋中的引號沒有另一個引號與之配對鼻听,那語法分析程序就[不會認為注釋結(jié)束] !!!
如果你以交互式運行 mysql财著,你會產(chǎn)生困惑,因為提示符從 mysql> 變?yōu)?’> 或 ">
一個分號;是指當前 SQL 語句的結(jié)束 并且跟隨它的任何東西表示下一行的開始精算。
不論 以交互式運行 mysql 還是用 mysql < some-file 讓 mysql 讀取文件(里面寫著命令)瓢宦,
這個限制均存在。
筆者認為:單行注釋最好用 # 開始
用 -- 做 注釋后面必須至少有一個空格,[忘寫了就會出現(xiàn)錯誤]!
發(fā)送到服務器之前灰羽,mysql客戶程序也執(zhí)行部分語句解析(例如驮履,它通過解析來確定在多語句行中的語句邊界)
之所以要求使用空格,是為了防止與自動生成SQL查詢有關(guān)的問題廉嚼,它采用了類似下面的代碼玫镐,其中,自動為“!payment!”插入“payment”的值:
UPDATE account SET credit=credit-!payment!
考慮一下怠噪,如果“payment”的值為負數(shù)如“-1”時會出現(xiàn)什么情況:
UPDATE account SET credit=credit--1
在SQL中“credit--1”是合法的表達式恐似,但是,如果“--1”被解釋為注釋開始傍念,部分表達式將被舍棄矫夷。結(jié)果是 表達式的意義與預期的意義完全不同。
UPDATE account SET credit=credit
該語句不會對值作任何更改憋槐!這表明双藕,允許注釋以“--”開始會產(chǎn)生嚴重后果。所以--后面必須使用空格
在MySQL 5.1中阳仔,mysql解析/* ...*/注釋的唯一局限性是結(jié)合該風格的注釋定界符使用的嘆號!標記了有條件執(zhí)行的SQL語句部分忧陪。
適用于交互式運行mysql 和 將命令放入一個文件中并以批處理模式使用mysql來處理mysql < file_name的文件。
詳細信息和例子參見1.8.4節(jié)近范,“MySQL對標準SQL的擴展”嘶摊。
MySQL服務器包含一些其他SQL DBMS中不具備的擴展。注意评矩,如果使用了它們叶堆,將無法把代碼移植到其他SQL服務器。在某些情況下斥杜,你可以編寫包含MySQL擴展的代碼蹂空,但仍保持其可移植性俯萌,方法是用/*... /注釋掉這些擴展。
在本例中上枕,MySQL服務器能夠解析并執(zhí)行注釋中的代碼咐熙,就像對待其他MySQL語句一樣,但其他SQL服務器將忽略這些擴展辨萍。例如:
SELECT /! STRAIGHT_JOIN */ col_name FROM table1,table2 WHERE ...
如果在字符“!”后添加了版本號棋恼,僅當MySQL的版本等于或高于指定的版本號時才會執(zhí)行注釋中的語法:
CREATE /*!32302 TEMPORARY */ TABLE t (a INT);
這句是說,如果你的版本號為3.23.02或更高锈玉,MySQL服務器將使用TEMPORARY關(guān)鍵字爪飘。
信息函數(shù)(安全常用)
函數(shù)名 | 函數(shù)功能 |
---|---|
CONNECTIOIN_ID() | 連接ID 第一連接就是1,以此類推拉背。 |
database() | 返回當前用戶师崎。MYSQL中的用戶的完整用戶名是 用戶名@登錄主機 |
LAST_INSERT_ID | 最后插入記錄ID 當一條語句插入多條記錄的時候,它只返回第一條記錄的ID椅棺。 |
user() | 當前用戶 |
version() | MySQL版本號 |
原文http://www.sqlinjectionwiki.com/Categories/2/mysql-sql-injection-cheat-sheet/
Version
SELECT @@VERSION
SELECT version()
Current User
SELECT user()
SELECT system_user()
Current Database
SELECT database()
@@version_compile_os