Mysql的管理及使用

第1章 Mysql的管理

1.1 鏈接管理mysql

mysql[options]   #Linux或UNIX shell提示符(終端窗口)
mysql --help   #查看幫助信息
mysql --version/-V   #查看客戶端程序的版本

01.常見的選項語法格式:mysql

長格式(--<option>)sql

簡易格式(-<option>)shell

02.經過指定的主機進行鏈接:數據庫

本地鏈接到在同一主機上運行的服務器vim

遠程鏈接到在其餘主機上運行的服務器安全

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二進制文件啓動app

1.3 mysql數據庫的關閉與啓動

01.數據庫關閉命令socket

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.pid
my.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"
esac
mysql

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/

相關文章
相關標籤/搜索