第1章 Mysql的管理 1.1 連接管理mysql mysql[options] #Linux或UNIX shell提示符(終端視窗) mysql --help #查看幫助信息 mysql --version/-V #查看客戶端程式的版本 01.常見的選項語法格式: 長格式(--<option>) ...
第1章 Mysql的管理
1.1 連接管理mysql
mysql[options] #Linux或UNIX shell提示符(終端視窗) mysql --help #查看幫助信息 mysql --version/-V #查看客戶端程式的版本
01.常見的選項語法格式:
長格式(--<option>)
簡易格式(-<option>)
02.通過指定的主機進行連接:
本地連接到在同一主機上運行的伺服器
遠程連接到在其他主機上運行的伺服器
03.常見特定於客戶機的連接選項
-u<user_name>或--host=<user_name>
-p<password>
-h<host_name>或--host=<host_name>
--protocol=<protocol_name> #協議
-P<port_number>或--port=<port_number>
-S<socket_name>或--socket=<socket_name>
1.2 資料庫啟動流程介紹
1 [root@db02 ~]# file /application/mysql/bin/mysqld 2 3 /application/mysql/bin/mysqld: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, not stripped
提示:單進程mysqld 其屬性LSB即二進位的可執行文件,mysql.server便於我們通過SYS-V啟動關閉的腳本
說明:support-files/mysql.server及mysqld_safe都是腳本文件,最後都調用mysqld二進位文件啟動
1.3 mysql資料庫的關閉與啟動
01.資料庫關閉命令
1 /etc/init.d/mysqld stop
2 mysqladmin -uroot -poldboy123 shutdown
註意:生產環境下禁止使用下述方式關閉mysql軟體
kill -9 #利用系統進程管理命令關閉MySQL kill pid # pid即資料庫服務對應的進程號 l killall mysqld #mysqld即資料庫服務對應的進程名 l pkill mysqld #mysqld即資料庫服務對應的進程名
02.資料庫啟動命令
1 /etc/init.d/mysqld start
2 application/mysql/bin/mysqld_safe [--user=mysql] &
1.3.1 perror查看錯誤詳細內容
在mysql使用過程中,由於操作系統引起的文件目錄不存在或sql語句錯誤引起的報錯,這些error會有相應的代碼如errorN、ErrcodeN,這裡"N"代表具體的錯誤號
1 [root@db02 ~]# perror 126 127 135 2 OS error code 126: Required key not available 3 MySQL error code 126: Index file is crashed 4 OS error code 127: Key has expired 5 MySQL error code 127: Record file is crashed 6 MySQL error code 135: No more room in record file
1.4 Mysql初始化配置文件
即在資料庫啟動之前通過/etc/my.cnf告訴啟動程式一系列預設置的選項
配置文件功能:影響伺服器進程的啟動;影響到客戶端程式
實例01
1 ./mysqld_safe --basedir=/application/mysql --datadir=/application/mysql/data --socket=/tmp/mysql.sock --user=mysql #指定mysql啟動參數
註意:由於指定了socket導致無法找到該文件,此時mysql無法進行正常連接,故使用mysql -uroot -poldboy123 -S /tmp/mysql.sock即可
1.4.1 配置my.cnf的方法
使用不同的"標簽/模塊"明確指定影響哪部分功能,代表一類程式
實例02
1 vim /etc/my.cnf 2 3 [mysqld] 4 basedir=/application/mysql 5 datadir=/application/mysql/data 6 socket=/tmp/mysql.sock 7 log-error=/var/log/mysql.log 8 port=3307 #其中,用戶無需指定 9 10 [mysql] 11 socket=/tmp/mysql.sock 12 user=root 13 password=oldboy123 #此處通過socket登錄,無需配置埠 14 /etc/init.d/mysqld restart #重啟生效
說明:此時檢查進程信息,可以看到與我們手動配置的my.cnf一致
1 [root@db02 ~]# ps -ef |grep [my]sql 2 3 root 3411 1918 0 15:52 pts/1 00:00:00 /bin/sh /application/mysql/bin/mysqld_safe 4 5 mysql 3548 3411 0 15:52 pts/1 00:00:00 /application/mysql/bin/mysqld --basedir=/application/mysql --datadir=/application/mysql/data --plugin-dir=/application/mysql/lib/plugin --user=mysql --log-error=/var/log/mysql.log --pid-file=/application/mysql/data/db02.pid --socket=/tmp/mysql.sock --port=3307
1.4.2 配置文件讀取順序
/etc/my.cnf ↓ ↓ ↓ /etc/mysql/my.cnf $MYSQL_HOME/my.cnf defaults-extra-file ~/.my.cnf
說明:假設4個配置文件都存在, 同時使用 --defaults-extra-file指定了參數文件,這時如果有一個"參數變數"在5個配置文件中都出現了,那麼後面的配置文件中的參數變數值會覆蓋前面配置文件中的參數變數值,就是說會使用 ~/. my.cnf中設置的值
註意:若使用 ./bin/mysqld_safe守護進程啟動mysql資料庫時,使用了 --defaults-file=<配置文件的絕對路徑>參數,這時只會使用這個參數指定的配置文件
1.5 Mysql多實例配置
多個mysqld+多套my.cnf+多套數據=>生產環境無用
思路:
01.初始化兩套數據到不同目錄mysql_install_db /data/3306 /data/3308 02.兩套配置文件 /data/3306/my.cnf /data/3308/my.cnf 03.兩個socket socket=/data/3306/mysql.sock socket=/data/3308/mysql.sock 04.兩套實例 /application/mysql/bin/mysqld_safe --defaults-file=/data/3306/my.cnf /application/mysql/bin/mysqld_safe --defaults-file=/data/3306/my.cnf 05.設計啟動腳本
1.5.1 實例配置文件及程式腳本
註意:需首先關閉當前mysql服務,防止造成埠衝突/etc/init.d/mysqld stop
1 [root@db02 ~]# vim /data/3306/my.cnf 2 [client] 3 port = 3306 4 socket = /data/3306/mysql.sock 5 6 [mysqld] 7 user = mysql 8 port = 3306 9 socket = /data/3306/mysql.sock 10 basedir = /application/mysql 11 datadir = /data/3306/data 12 log-bin = /data/3306/mysql-bin 13 server-id = 6 14 15 [mysqld_safe] 16 log-error=/data/3306/oldboy_3306.err 17 pid-file=/data/3306/mysqld.pidmy.cnf
[root@db02 ~]# vim /data/3306/mysql #!/bin/sh port=3306 mysql_user="root" CmdPath="/application/mysql/bin" mysql_sock="/data/${port}/mysql.sock" mysqld_pid_file_path=/data/3306/3306.pid start(){ if [ ! -e "$mysql_sock" ];then printf "Starting MySQL...\n" /bin/sh ${CmdPath}/mysqld_safe --defaults-file=/data/${port}/my.cnf --pid-file=$mysqld_pid_file_path 2>&1 > /dev/null & sleep 3 else printf "MySQL is running...\n" exit 1 fi } stop(){ if [ ! -e "$mysql_sock" ];then printf "MySQL is stopped...\n" exit 1 else printf "Stoping MySQL...\n" mysqld_pid=`cat "$mysqld_pid_file_path"` if (kill -0 $mysqld_pid 2>/dev/null) then kill $mysqld_pid sleep 2 fi fi } restart(){ printf "Restarting MySQL...\n" stop sleep 2 start } case "$1" in start) start ;; stop) stop ;; restart) restart ;; *) printf "Usage: /data/${port}/mysql {start|stop|restart}\n" esacmysql
1.5.2 創建3308埠配置文件
1 \cp /data/3306/my.cnf /data/3308/ 2 \cp /data/3306/mysql /data/3308/ 3 sed -i 's/3306/3308/g' /data/3308/my.cnf 4 sed -i 's/server-id = 6/server-id = 8/g' /data/3308/my.cnf 5 sed -i 's/3306/3308/g' /data/3308/mysql
1.5.3 創建數據目錄授權
1 mkdir -p /data/{3306,3308}/data 2 chown -R mysql.mysql /data/ 3 chmod 700 /data/{3306,3308} #增加其安全性
1.5.4 初始化數據並創建錯誤日誌文件
1 cd /application/mysql/scripts 2 ./mysql_install_db --defaults-file=/data/3306/my.cnf --basedir=/application/mysql --datadir=/data/3306/data --user=mysql 3 ./mysql_install_db --defaults-file=/data/3308/my.cnf --basedir=/application/mysql --datadir=/data/3308/data --user=mysql 4 5 6 touch /data/3306/oldboy_3306.err 7 touch /data/3308/oldboy_3308.err
說明:5.6.36特殊性即不會自動創建錯誤日誌文件
1.5.5 啟動資料庫併進行測試
1 /data/3306/mysql start
2 /data/3308/mysql start
3
4 sleep 5
註意:由於mysql服務的預設埠為3306,故在啟動之前需先將mysql服務停止運行並關閉開機自啟動
1 [root@db02 scripts]# netstat -lntup|grep 330 2 tcp 0 0 :::3306 :::* LISTEN 1793/mysqld 3 tcp 0 0 :::3308 :::* LISTEN 2001/mysqld 4 5 [root@db02 ~]# ps -ef |grep [m]ysql 6 root 1217 1 0 22:40 ? 00:00:00 /bin/sh /application/mysql/bin/mysqld_safe --defaults-file=/data/3306/my.cnf --pid-file=/data/3306/3306.pid 7 mysql 1403 1217 0 22:40 ? 00:00:01 /application/mysql/bin/mysqld --defaults-file=/data/3306/my.cnf --basedir=/application/mysql --datadir=/data/3306/data --plugin-dir=/application/mysql/lib/plugin --user=mysql --log-error=/data/3306/oldboy_3306.err --pid-file=/data/3306/3306.pid --socket=/data/3306/mysql.sock --port=3306 8 9 root 1426 1 0 22:40 ? 00:00:00 /bin/sh /application/mysql/bin/mysqld_safe --defaults-file=/data/3308/my.cnf --pid-file=/data/3308/3308.pid 10 mysql 1611 1426 0 22:40 ? 00:00:01 /application/mysql/bin/mysqld --defaults-file=/data/3308/my.cnf --basedir=/application/mysql --datadir=/data/3308/data --plugin-dir=/application/mysql/lib/plugin --user=mysql --log-error=/data/3308/oldboy_3308.err --pid-file=/data/3308/3308.pid --socket=/data/3308/mysql.sock --port=3308
1.5.5.1 加入開機自啟
1 vim /etc/rc.local
2
3 /data/3306/mysql start
4 /data/3308/mysql start
1.5.6 mysql多實例登錄
1 mysql -S /data/3306/mysql.sock
2 mysql -S /data/3308/mysql.sock #或mysql -h 10.0.0.52 -P 3306
第2章 Mysql用戶管理
2.1 用戶的介紹
01.定義:用戶名+主機域(host指定要登陸本機的用戶主機,而非本機)
02.功能作用:連接資料庫、管理資料庫對象及數據
03.連接資料庫:
A.定義用戶:用戶名+主機域、密碼
B.定義許可權:對不同對象進行許可權(角色)定義
grant 許可權 on 許可權範圍(對象) to 用戶 identified by '密碼';
04.許可權(角色):
對資料庫的讀、寫等操作,如create、select、insert、update等
資料庫定義好的一組許可權的定義,如all privileges、replication slave
05.許可權範圍:
全庫級別:*.* (所有資料庫對象) 單庫級別:banana.* (oldboy單庫下所有對象) 單表級別:banana.test (單表級別)
註意:當在多個許可權範圍上設置了同一個用戶的許可權時,以綜合最大許可權為準。故在一般情況下不要在多個許可權範圍內設置許可權,如庫級別oldboy.*、表級別oldboy.test
06.用戶:
repl@localhost repl@'10.0.0.53' repl@'10.0.0.%'(%為通配符,匹配所有)或10.0.0.0/255.0.0.0 repl@'10.0.0.5%'
#網段帶匹配符%則必須加' ',用戶可加可不加
2.2 用戶許可權實例
查看當前所有用戶(選擇)
select user,password,host from mysql.user;
創建用戶
語法:CREATE USER '用戶'@'主機' IDENTIFIED BY '密碼'; 實例:create user 'banana'@'10.0.0.%' identified by '123';
授權用戶
語法:GRANT ALL ON *.* TO '用戶'@'主機'; 實例:grant all on banana.* to banana@'172.16.1.%';
其他實例
grant all on *.* to banana@'172.16.1.%' identified by '123'; #創建用戶,同時進行授權 grant all on *.* to banana@'localhost' identified by '123' with grant option; #授權單表root一樣的許可權 grant select,create,insert,update on banana.* to banana@'10.0.0.%' identified by '123'; #只對banana資料庫下的對象進行增insert create、改update、查select
收回用戶許可權
語法:REVOKE INSERT ON *.* FROM '用戶'@'主機'; 實例:revoke drop on banana.* from 'banana'@'10.0.0.%';
查看用戶對應許可權
語法:SHOW GRANTS FOR '用戶'@'主機'; 實例:show grants for banana@'10.0.0.%';
註意:mysql內自帶的命令可以大寫,而自身定義的用戶管理需區分大小寫;儘量不要修改授權表
說明:使用資料庫自帶的命令無需修改授權表如drop、grant,而使用如delete、update等命令則需修改授權表,如下
刪除用戶
語法:drop user 'user'@'主機域; 實例:drop user banana@'10.0.0.52'; delete from mysql.user where user='banana' and host='localhost'; #強制刪除用戶(危險) flush privileges;
總結說明:可以授權的用戶許可權create, select, insert, update, delete, drop, reload, shutdown, process, file, references, index, alter, show databases, super, create temporary tables, lock tables, execute, replication slave, replication client, create view, show view, create routine, alter routine, create user, event, trigger, create tablespace
2.3 Mysql忘記密碼的解決方法
01.停止mysql服務
1 /etc/init.d/mysqld stop
02.添加參數啟動服務
1 /application/mysql/bin/mysqld_safe --skip-grant-tables --skip-networking --user=mysql &
說明:在此模式下啟動情況為:無密碼登陸、網路用戶無法登陸(只能本地登錄)、與授權有關的命令均無法執行,如grant,revoke,drop user,create user
03.修改密碼
1 mysql 2 3 mysql> use mysql 4 mysql> update mysql.user set password=PASSWORD('123') where user='root' and host='localhost'; #只針對5.6 5 mysql> flush privileges;
04.重啟mysql服務
1 /etc/init.d/mysqld restart
05.登錄驗證
1 mysql -uroot -p123
至此,密碼修改成功
第3章 MySQL客戶端
3.1 Mysql客戶端命令
SQL是用戶用來管理及控制資料庫的專用語言
mysql:
用於資料庫連接管理;將用戶SQL語句發送到伺服器
mysqladmin:
命令行管理工具
mysqldump:
備份資料庫和表的內容
3.1.1 ①mysql客戶端介面自帶功能
\h 或 help 或 ? #獲取幫助信息,如help grant \G #格式化輸出(行轉列),如select * from mysql.user\G \T 或 tee #記錄操作日誌,如tee /tmp/mysql.log 正誤均記錄 \c 或 CTRL+c #退出,如CTRL+d,exit,\q,quit等 \s 或 status #查看資料庫負載、版本及連接等狀態信息 \. 或 source #調用SQL腳本,如source world.sql; \u 或use #進入/切換資料庫,如use world
快捷鍵
上下翻頁 tab 補全表名 ctrl + C 退出 ctrl + L 清屏
3.1.2 ②mysqladmin命令
命令幫助:mysqladmin --help 語法:mysqladmin -u<name> -p<password> commands
實例:
mysqladmin version
mysqladmin processlist
mysqladmin status
mysqladmin ping
mysqladmin shutdown
mysqladmin variables
3.1.3 ③mysqldump命令
命令幫助:mysqldump --help 基本語法: Usage: mysqldump [OPTIONS] database [tables] OR mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...] OR mysqldump [OPTIONS] --all-databases [OPTIONS]
3.2 SQL語句
3.2.1 DDL 數據定義語言
定義對象:庫(名字、特性)、表(表名字、列信息)
對於庫定義:創建、刪除、修改(本身和庫中的對象->表,視圖,存儲過程,函數,觸發器)
表定義:創建(定義表結構)、刪除(對於表本身)、修改(只針對錶結構非表內容)
3.2.1.1 庫定義
查看庫
show databases; show databases like '%ban%'; #模糊匹配
創建庫定義
語法:CREATE DATABASE db_name CHARACTER SET charset_name COLLATE collation_name; 實例:create database banana; create database banana_tong character set gbk collate gbk_chinese_ci; #指定字元集建庫
說明:在一些SQL語句的結尾處要使用";"分號或者使用"\g"或"\G"來結束語句的運行
修改庫字元編碼
語法:ALTER DATABASE [db_name] CHARACTER SET charset_name COLLATE collation_name;
實例:alter database banana charset gbk;
刪除庫
drop database banana;
切庫
use baanana;
3.2.1.2 表定義
表屬性:欄位、數據類型、索引 ==>預設:字元集、引擎
表定義(列->必須定義,至少一列):
表名、列名、列屬性(數據類型、列約束)
列定義的範圍說明:
1)數據類型->字元/數字
2)約束條件->子健、外鍵、唯一
3)列屬性->比較特殊的定義
定義表之前需先進入資料庫
use world;
創建表
語法:CREATE TABLE 表名 (列名 列定義) 實例:create table test(id int); create table student(idcard int ,name char(30),sex char(4)); #創建多列
查看表結構
desc student;
查看建表語句
show create table student;
修改表定義(表名)
rename table student to test1;
alter table test1 rename to people;
添加表特性
alter table people add addr char(40) NOT NULL; alter table people add age int(4) after name; alter table people add tel varchar(15) first; #同時添加多個列定義 alter table people add id int(10) first,add sex char(4) after name;
刪除表結構(列欄位)
alter table people drop sex;
修改表定義/數據類型
alter table people modify name char(20); alter table people change name people_name char(30);
3.2.2 DCL 資料庫控制語言
用戶授權:grant
語法:GRANT ALL ON *.* TO 'user'@'localhost'; 實例:grant select,create,insert,update on banana.* to 'banana'@'10.0.0.%' identified by '123'; #創建用戶的同時進行授權
回收許可權:revoke
語法:REVOKE INSERT ON *.* FROM sys@localhost; 實例:revoke drop,delete on banana.* from sys@localhost;
3.2.3 DML 數據操作語言
插入數據
語法:insert into <表名> [(<欄位名1>[,..<欄位名n > ])] values (值1 )[,(值n )] 實例:insert into banana values(1,'boy'); #插入一行數據 insert into banana values(1,'boy'), (2,'girl'); #插入多行數據 #只針對某一列插入數據 insert into test(id,name) values(1,'boy');
更新/修改表(切記要有where條件)
update test2 set name='haha' where name='girl';
刪除表內容(切記要有where條件)
delete from test where id=1; # 邏輯刪除,一行一行刪。 truncate table test; # 物理刪除,pages(block) ,效率高 insert into `test` values(1,'apple'),(2,'pear'),(3,'banana'), (4,'lemon'), (5,'orange')
3.2.3.1 [企業案例]生產環境中d偽刪除
01.為表添加一個state列
TINYINT說明:即欄位類型,若設置為UNSIGNED類型,只能存儲從0到255的整數,不能用來儲存負數
1 mysql> alter table test2 add state tinyint(2) not null default 1; 2 mysql> desc test2; 3 4 +-------+----------+------+-----+---------+-------+ 5 | Field | Type | Null | Key | Default | Extra | 6 +-------+------------+------+-----+---------+-------+ 7 | id | int(11) | YES| | NULL | | 8 | name | varchar(20)| YES| | NULL | | 9 | state | tinyint(2) | NO | | 1 | | 10 +-------+-------------+------+-----+------+---+
02.查看當前的state狀態
1 mysql> select * from test2; 2 3 +----+---------+-------+ 4 | id | name | state | 5 +----+---------+-------+ 6 | 1 | boy | 1 | 7 | 2 | girl | 1 | 8 | 3 | inca | 1 | 9 | 4 | zuma | 1 |
03.更新並修改state數據為0
1 mysql> update test2 set state=0 where name='boy'; 2 mysql> select * from test2; 3 4 +----+---------+-------+ 5 | id | name | state | 6 +----+---------+-------+ 7 | 1 | boy | 0 | 8 | 2 | girl | 1 | 9 | 3 | inca | 1 | 10 | 4 | zuma | 1 |
04.當查詢時使用where條件,此時只會顯示state=1的記錄,其效果與刪除類似
1 mysql> select * from test2 where state=1; 2 3 +----+---------+-------+ 4 | id | name | state | 5 +----+---------+-------+ 6 | 2 | girl | 1 | 7 | 3 | inca | 1 | 8 | 4 | zuma | 1 |
3.2.3.2 mysql安全模式(防止不加條件誤刪)
1 [root@db02 ~]# mysql -uroot -p123 -U 2 3 mysql> update test2 set name='oldgirl'; 4 5 ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column
說明:mysql命令加上選項-U後,當發出沒有where或limit關鍵字的update或delete時,mysql程式拒絕執行
3.2.4 DQL數據查詢語言
語法:SELECT <欄位1,欄位2,...> FROM <表名> WHERE <表達式>
其中,select、from、where是不能隨便改的,是關鍵字,支持大小寫
查看用戶的連接信息
select user,password,host from mysql.user; #模糊查詢數據 select user,password,host from mysql.user where user like 'sy%';
查看test2表中的信息
select * from sys.test2; #查看所有信息 select id,name from sys.test2;
特殊信息查詢
select id,name from test2 where id=2; select id,name from test2 where id>2 and id<4; #查看id大於2且小於4的記錄 select id,name from test2 where name='sys'; select id,name from test2 order by id asc; #提取記錄排序 select id,name from test2 order by limit 1,3; #顯示跳過第一行後的三行(需要與排序配合使用)
註意:select必須同from搭配使用
此筆記是本人學習摘記整理而成,此為初稿(尚有諸多不完善之處),原創作品允許轉載,轉載時請務必以超鏈接形式標明文章原始出處,作者信息和本聲明,否則將追究法律責任。http://www.cnblogs.com/bananaaa/