MariaDB基礎詳解

數據庫結構模型分類
一、層次模型
二、網狀模型
三、關係模型
關係模型的組成部分
  • 二維關係
      • row
      • column
    • 索引
      • index
    • 視圖
      • view (只包含固定字段,不包含其餘字段)
關係型數據庫的常見組件:
  • 數據庫 : Database
  • : table
    • : row
    • : column
  • 索引 : index
  • 視圖 : view
  • 用戶 : user
  • 權限 : privilege
  • 存儲過程 : procedure
  • 存儲函數 : function
  • 觸發器 : trigger
  • 事件調度器 : event schedule
DBA的組成部分
  • SQL引擎
    • 分析器
    • 計劃執行器
    • 優化器
    • 操做求解器
  • 存儲引擎
    • 文件和存儲接口
    • 緩衝管理器
    • 磁盤空間管理器
    • 恢復管理器
    • 事務管理器
    • 鎖管理器
SQL接口(structured query Language)

相似於OS的shell接口,操做數據庫的數據接口,也提供了編程功能mysql

  • SQL接口語言的標準(其由ANSL組織定義)
    • SQL86
    • SQL89
    • SQL92
    • SQL99
    • SQL03
  • SQL接口的語言分類
    • DDL:(Data Defined Language)
      • create
      • alter
      • drop
    • DML:(Data Manapulating Language)
      • insert
      • delete
      • update
      • select
    • DCL: (Data Control Language)
      • grant
      • revoke
DB是否支持事務的測試標準
  • ACID正則表達式

    • A : 原子性 --> 不可分割的總體
    • C : 一致性 --> 數據的變化是一致性的
    • I : 隔離性 --> 事務彼此之間是隔離的
    • D : 持久性 --> 只要一個事務完成,它都是持久完成的。
  • 事務是將組織多個操做爲一個總體,要麼所有執行,要所有不執行。其實現機制爲:
    • 回滾機制
    • 事務機制
RDBMS設計範式基礎概念

設計關係數據庫時,聽從不一樣的規範要求,設計出合理的關係型數據庫,這些不一樣的規範要求被稱爲不一樣的範式,各類範式呈遞次規範,越高的範式數據庫冗餘越小。目前關係數據庫有六種範式:第一範式(1NF)、第二範式(2NF)、第三範式(3NF)、巴德斯科範式(BCNF)、第四範式(4NF)和第五範式(5NF,又稱完美範式)。知足最低要求的範式是第一範式(1NF)。在第一範式的基礎上進一步知足更多規範要求的稱爲第二範式(2NF),其他範式以次類推。通常說來,數據庫只需知足第三範式(3NF)就好了。sql

  • 1) 第一範式(1NF)
    • 所謂第一範式(1NF)是指在關係模型中,對域添加的一個規範要求,全部的域都應該是原子性的,即數據庫表的每一列都是不可分割的原子數據項,而不能是集合,數組,記錄等非原子數據項。即實體中的某個屬性有多個值時,必須拆分爲不一樣的屬性。在符合第一範式(1NF)表中的每一個域值只能是實體的一個屬性或一個屬性的一部分。簡而言之,第一範式就是無重複的域,並不可分析
  • 2) 第二範式 (2NF)
    • 第二範式(2NF)是在第一範式(1NF)的基礎上創建起來的,即知足第二範式(2NF)必須先知足第一範式(1NF)。第二範式(2NF)要求數據庫表中的每一個實例或記錄必須能夠被惟一地區分,即不能有兩個行是同樣的。選取一個能區分每一個實體的屬性或屬性組,做爲實體的惟一標識。
  • 3) 第三範式 (3NF)
    • 第三範式(3NF)是第二範式(2NF)的一個子集,即知足第三範式(3NF)必須知足第二範式(2NF)。簡而言之,第三範式(3NF)要求一個關係中不包含已在其它關係已包含的非主關鍵字信息。簡而言之,不依賴於非主屬性,表與子表中不能有相同的字段。
數據庫的運行模型:

數據庫爲C/S架構,以下:shell

  • S : server ,監聽於套接字止,接收並處理客戶端的應用請求
  • C : Client
    • 程序接口
      • CLI
      • GUI
    • 應用編程接口
      • ODBC : Open Database Connection(開放式數據互聯)
MYSQL的工做模型
  • 單進程多線程
  • 用戶鏈接經過線程實現
  • 一個線程池能夠定義mysql的併發鏈接
  • 處理用戶鏈接的叫鏈接線程
  • 數據字典:數據一切的元數據信息,依賴mysql庫來存儲
數據庫的基礎概念
  • 1)約束 : Constraint
    • 主鍵 : 一個或多個字段的組合,填入的數據必須能在本表中惟一標識本行,且必須提供數據,即NOT NULL
    • 惟一鍵 : 一個或多個字段的組合,填入的數據必須能在本表中惟一標識本行,容許爲null
    • 外鍵 : 一個表中的某字段可填入數據取決於另外一個表中的主鍵已有的數據。
    • 檢查性約束 : 表達式約束,取決於表達式的要求
  • 2) 索引 : 將表中的一個或多個字段中的數據複製一份另存,而且這些字段須要按特定的次序排序存儲,常見的索引類型:
    • 樹形索引(MariaDB默認爲Btree索引)
    • bash索引
      索引有利於讀請求,但不得寫請求
  • 3) 關係運算
    • 選擇 : 挑選出符合條件的行(部分)
    • 投影 : 挑選出須要的字段
    • 鏈接 : 將多張表關聯起來
      • 內鏈接
      • 外鏈接
        • 左外鏈接
        • 右外鏈接
      • 自鏈接
  • 4)數據抽象 :
    • 物理層 : 決定數據的存儲格式,即RDBMS 在磁盤上如何組織文件
    • 邏輯層 : 描述DB存儲什麼數據,以及數據間存在什麼樣的關係
    • 視圖層 : 描述DB中的部分數據
  • 5) 關係模型的分類
    • 關係模型
    • 實體關係模型
    • 基於對象的關係模型
    • 半結構化的關係模型
      • XML格式就是一種半結構化數據
常見的RDBMS數據庫
  • MySQL
  • MariaDB
  • PostgreSQL(pgsql)
  • Oracle
  • MSSQL

=============數據庫

MariaDB的特性
  • 插件式存儲引擎(注:存儲引擎也稱之爲"表類型")
    • MYISAM --> Aria
      • 不支持事務
    • INNODB --> XtraDB
      • 支持事務
  • 諸多擴展和新特性
  • 提供了更多的測試組件
  • truly open source
Mariadb的安裝
通用二進制格式安裝過程
a. 準備數據目錄
    以/mydata/data爲例;
b. 配置mariadb
                    # groupadd -r -g 306 mysql
                    # useradd -r -g 306 -u 306 mysql
                    # tar xf mariadb-VERSION.tar.xz -C /usr/local
                    # ln -sv mariadb-version mysql
                    # cd /usr/local/mysql
                    # chown -R root:mysql ./*
                    # scripts/mysql_install_db --datadir=/mydata/data --user=mysql
                    # cp supper-files/mysql.server /etc/rc.d/init.d/mysqld
                    # chkconfig --add mysqld
c. 準備配置文件
    配置格式:類ini格式,爲各程序均經過單個配置文件提供配置信息;
    [prog_name]

能用二進制格式安裝,配置文件查找次序:
/etc/my.cnf --> /etc/mysql/my.cnf --> --default-extra-file=/PATH/TO/CONF_FILE --> ~/.my.cnf

OS提供的mariadb rpm包安裝的配置文件查找次序:
/etc/mysql/my.cnf --> /etc/my.cnf --> --default-extra=/PATH/TO/conf_file --> ~/my.cnf

以上二者越靠後就是最後生效的.

                    # mkdir /etc/mysql
                    # cp support-files/my-large.cnf /etc/mysql/my.cnf

                    添加三個選項:
                        [mysqld]
                        datadir = /mydata/data
                        innodb_file_per_table = on
                        skip_name_resolve = on
MariDB程序的組成
  • Client
    • mysql : CLI交互式客戶端程序
    • mysqldump : 備份工具
    • mysqladmin: 管理工具
    • mysqlbinlog : 查看二進制日誌工具
  • Server
    • mysqld: 服務端進程
    • mysqld_safe : 服務端進程,默認也是運行的此進程
    • mysqld_multi : 服務端進程, 多實例
    • mysql_upgrade : 升級工具
服務端監聽的兩種socket地址
  • ip socket
    • 監聽在3306/tcp,支持遠程通訊
  • unix socket
    • 監聽在sock文件上(/tmp/mysql.sock, /var/lib/mysql/mysql.sock),僅支持本地通訊,通訊主機爲localhost,127.0.0.1都基於unix socket文件通訊
命令行交互式客戶端程序---mysql工具
  • options
    • -uUSERNAME : 用戶名,默認爲root
    • -hHOST : 服務器主機,默認爲localhost
    • -pPASSWD : 用戶的密碼
    • dDB_NAME: 鏈接到服務端以後,指明默認數據庫
    • -e 'SCRIPT' : 鏈接至MYSQL運行某命令後,直接退出,並返回結果
      ````
      mysql -uroot -h127.0.0.1 -pmagedu -e 'show databases;'
注意: mysql的用戶賬號由兩部分組成,'username'@'hostname',其中host用於限制此用戶可經過哪些主機鏈接當前的MSYQL服務器
  • 支持通配符:編程

    • % : 匹配任意長度的任意字符數組

      172.16.%.%
    • _ : 匹配任意單個字符
  • 內置命令
    • \u DB_NAME : 設定哪一個庫爲默認數據庫
    • \q : 退出
    • \d CHAR : 設定新的語句結束符
    • \g : 語句通用結束標記
    • \G : 語句結束標記,但以豎排方式顯示
    • \s : 返回客戶端與服務端的鏈接狀態
    • \c : 取消命令運行
經過mysql協議發往服務器執行並取回結果,每一個命令都必須有結束符,默認爲";",示例以下:

for i in {1..100};do AGE=$[$RANDOM%100];mysql -uroot -pM8T9cw -e "insert mydb.student(id,name,age) value ($i,\"stu$i\",$AGE);"; done
  • 獲取命令幫助
    • help
SQL中的數據類型
  • 字符型
    • 定長字符型 : (最多255個字符)
      • CHAR(#) : 不區分字符大小寫
      • BINARY(#) : 區分字符大小寫
    • 可變長字符型 :
      • VARCHAR(#) : 不區分字符大小寫,須要在字符長度加1,最多65536個字符
      • VARBINARY(#) : 區分字符大小寫,須要在字符長度加1,最多65536個字符
      • TEXT : 可存文本(2^32)個字符,只能存純文本,不區分大小寫
        • TINYTEXT
        • TEXT
        • MEDIUMTEXT
        • LONGTEXT
      • BLOB : 文本(2^32)個字符,能夠存儲圖片
  • 內置類型
    • SET : 集合
    • ENUM : 枚舉
  • 數值型
    • 精確數值型
      • INT
        • TINYINT : 一個字節
        • SMALLINT : 二個字節
        • MEDINUMINT : 三個字節
        • INT : 四個字節
        • BIGINT : 八個字節
    • 近似數據型
      • FLOAT : 單精度
      • DOBULE : 雙精度
  • 日期時間型
    • DATE : 日期型
    • TIME : 時間型
    • DATETIME : 日期時間型
    • TIMESTAMP : 時間戳(從過去到如今通過的秒數)
    • YEAR(2) : 2位年數
    • YEAR(4) : 4位年數
  • 數據類型修飾符
    • 全部類型都適用:
      • NOT NULL : 非空
      • DEFAULT value : 默認值
    • 數值型適用
      • AUTO_INCREMENT : 自增加
      • UNSIGNED : 無符號,一般用於Int後面,進行修飾爲正整數
    • 字段修飾符
      • PRIMARY KEY : 主鍵定義
      • UNIQUE KEY : 惟一鍵定義

==========bash

數據庫操做語言

數據庫操做
  • 使用格式
create database | schema [if not exists]'DB_NAME';
drop database | schema 'DB_NAME';
  • 查看數據庫
    • show databases;
  • 建立數據庫
    • create database mydb;
  • 刪除數據庫
    • drop database mydb;
  • 查看支持的全部字符集
    • show character set;
  • 查看支持的全部排序規則
    • show collation;
  • 修改數據庫的默認字符集
    • alter database testdb character set utf32;
  • 修改數據庫的默認字符排序規則
    • alter database testdb collate utf32_sinhala_ci;
表操做
  • 使用格式
create table [if not exists] tb_name (col1 datatype 修飾符, col2 datatype 修飾符) engine=' '
  • 查看全部的引擎(被支持的)
    • show engines
  • 查看全部數據庫中的表
    • show tables;
    • show tables from mysql;
  • 查看錶結構
    • desc students;
  • 建立表
    • create table students(id int unsigned not null primary key, name varchar(30) not null, age tinyint unsigned not null,gender enum('F','M'))
  • 向表中添加字段
    • alter table students add second_name char(30);
  • 向表中刪除字段
    • alter table students drop second_name;
  • 對錶添加主鍵
    • alter table students2 add primary key (id);
  • 對錶刪除主鍵
    • alter table students2 drop primary key;
  • 對錶添加索引
    • alter table students2 add index name (name);
  • 對錶刪除索引
    • alter table students2 drop index name;
    • drop index name on students2;
  • 對錶添加惟一鍵
    • alter table students drop second_name;
  • 對錶刪除惟一鍵
    • alter table students drop index name;
  • 修改字段字義屬性服務器

    • alter table students modify name char(20);
    • alter table students2 change name new_name char(20) after id;
    • alter table students2 change name new_name char(20);多線程

      modify : 只能夠修改字段定義的屬性
      change : 能夠修改字段名稱和定義的字段屬性
  • 查看錶狀態
    • show table status like 'students2'\G
  • 修改表引擎
    • alter table students2 engine[=]myisam;
  • 查看錶的字段描述
    • desc students;
  • 查看庫中的全部表
    • show tables
    • show tables from mysql;
  • 刪除表
    • drop table students2;
向表中插入數據
  • insert weizi value(1,'zhen',30,'F');
  • insert weizi values(3,'wei',30,'F'),(4,'ping',31,'F');
  • insert weizi (id,name) value (5,"weizi");
刪除表中的數據
  • delete from weizi where name="zhen";
  • delete from weizi where age is null;
  • delete from weizi where age > 30;
  • delete from weizi where id >=50 and age <=20;
  • delete from weizi order by age asc limit 5;
修改表中的字段值
  • update weizi set age=35 where id=3 and age=30;
  • update weizi set age=age-5 where age=35;
  • update weizi age=age-age;
  • update weizi set age=age-5 where order by id desc limit 10;
  • update weizi set age=age-15 where name not like 'stu%';
Select操做語句
  • 使用格式
select col1,col2,....from tb1_name [where clause] [order y 'col_name'] [limit [m,]n]
  • 字段表示法
    • * : 表示全部字段
    • as : 字段別名, col1 as alias1
  • where clause
    • 操做符:
      • ==
      • <
      • >
      • <=
      • >=
      • !=
      • between....and...
    • 條件邏輯操做
      • and
      • or
      • not
    • 模糊匹配
      • like
        • %
        • _
      • rlike 'pattern' : 基於正則表達式匹配
      • is null
      • is no null
  • 排序
    • desc : 降序
    • asc : 升序
Select示例
  • select name,age from students where age >30 and age<80;
  • select name,age from students where age between 30 and 80;
  • select name from students where name like '%ang%';
  • select name from students where name rlike '^.*ang.*$;
  • select name,age from students where age is null;
  • select name,age form students where age is not null;
  • select id,name from students order by name;
  • select id,name from students order by name desc;
權限及受權管理
  • 用戶表示方法:
username@host
  • 管理權限的分類
    • 管理權限
    • 數據庫
    • 字段
    • 存儲例程
受權:
  • 受權語法格式
    • grant pri_type,...on [object_type] db_name.tbl_name to 'user'@'host' [identified by 'PASSWD']
      • pri_type
        • all privileges : 表示所有權限
      • db_name.tbl_name的表示方法:
        • *.* : 全部庫的全部表
        • db_name.* : 指定庫的全部表
        • db_name.tbl_name : 指定庫的特定表
        • db_name.routine_name : 指定庫上的存儲過程或存儲函數
      • object_type
        • table
        • function
        • procedure
  • 受權示例:
    • grant all privileges on mydb.* to 'zhenping'@'172.16.%.%' identified by 'MT8ddd';
取消權限
  • 取消受權語法格式
    • revoke pri_type,.... on db_name.tb_name from 'user'@'host';
  • 取消受權示例:
    • revoke all privileges on mydb.* from 'zhenping'@'172.16.%.%';
查看用戶權限
  • show grants for 'user'@'host';
讓新受權的權限當即生效
  • flush privileges;
1 Mariadb服務進程啓動時會讀取mysql庫中的全部受權表至內存中;
2 grant和revoke等執行權限操做時會保存於表中,mariadb的服務進程會自動重讀受權表
3 對於不可以或不能及時重讀受權表,可手動讓服務進程重啓受權表,使用flush privileges
做者:魏鎮坪連接:http://www.jianshu.com/p/e59afa955a2d來源:簡書著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。
相關文章
相關標籤/搜索