mysql中不能存儲數(shù)組,但是可以通過傳入的字符串截取成多個字符然后傳入到臨時表中,然后使用游標(biāo)或者直接關(guān)聯(lián)表過濾數(shù)據(jù)來儲存。
公司主營業(yè)務(wù):做網(wǎng)站、成都網(wǎng)站建設(shè)、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)推出邯鄲免費做網(wǎng)站回饋大家。
具體步驟如下所示:
1、創(chuàng)建數(shù)據(jù)庫,就如下圖所示一樣。
2、根據(jù)學(xué)生編號批量刪除學(xué)生信息,如下圖所示。
3、聲明初始化變量,看到以下畫面。
4、獲取傳入?yún)?shù)數(shù)組長度,創(chuàng)建臨時表,所輸入的如下圖所示。
5、截取數(shù)組字符串并依次存入到臨時表中供后面業(yè)務(wù)使用。
MySQL命令行導(dǎo)出數(shù)據(jù)庫:
1,進(jìn)入MySQL目錄下的bin文件夾:cd
MySQL中到bin文件夾的目錄
如我輸入的命令行:cd
C:\Program
Files\MySQL\MySQL
Server
4.1\bin
(或者直接將windows的環(huán)境變量path中添加該目錄)
2,導(dǎo)出數(shù)據(jù)庫:mysqldump
-u
用戶名
-p
數(shù)據(jù)庫名
導(dǎo)出的文件名
如我輸入的命令行:mysqldump
-u
root
-p
news
news.sql
(輸入后會讓你輸入進(jìn)入MySQL的密碼)
(如果導(dǎo)出單張表的話在數(shù)據(jù)庫名后面輸入表名即可)
3、會看到文件news.sql自動生成到bin文件下
命令行導(dǎo)入數(shù)據(jù)庫:
1,將要導(dǎo)入的.sql文件移至bin文件下,這樣的路徑比較方便
2,同上面導(dǎo)出的第1步
3,進(jìn)入MySQL:mysql
-u
用戶名
-p
如我輸入的命令行:mysql
-u
root
-p
(輸入同樣后會讓你輸入MySQL的密碼)
4,在MySQL-Front中新建你要建的數(shù)據(jù)庫,這時是空數(shù)據(jù)庫,如新建一個名為news的目標(biāo)數(shù)據(jù)庫
5,輸入:mysqluse
目標(biāo)數(shù)據(jù)庫名
如我輸入的命令行:mysqluse
news;
6,導(dǎo)入文件:mysqlsource
導(dǎo)入的文件名;
如我輸入的命令行:mysqlsource
news.sql;
1,每個數(shù)據(jù)庫對應(yīng)一個文件夾,文件夾名和庫名相同;
2,(單獨的表空間中) 每張表對應(yīng)幾個文件,文件名和表名相同,innodb引擎中對應(yīng)兩個文件,后綴名為:frm、ibd;
frm文件:存儲的是表結(jié)構(gòu)信息。
ibd文件:存儲的是表里的數(shù)據(jù)、索引等。
一、配置:
環(huán)境:
CentOS7?
VMware
筆者配置了四臺虛擬機:
K8S-Master節(jié)點: 3GB內(nèi)存? ?2核CPU ? 20GB硬盤空間
K8S-node1節(jié)點:? 2GB內(nèi)存? ?2核CPU ? 30GB硬盤空間
K8S-node2節(jié)點:? 2GB內(nèi)存? ?2核CPU ? 30GB硬盤空間
鏡像倉庫節(jié)點:? ? ? 2GB內(nèi)存? ?2核CPU ? 50GB硬盤空間
二、節(jié)點規(guī)劃:
使用三臺虛擬機搭建K8S集群,使用一臺虛擬機搭建鏡像倉庫。
每臺虛擬機配置兩塊網(wǎng)卡,其中一塊為“NAT模式”,用于拉取鏡像等功能。
另外一塊網(wǎng)卡為“僅主機模式”,用于集群節(jié)點間的通信。歸劃如下:
K8s-master節(jié)點:
僅主機模式:10.10.10.200
NAT模式: ?192.168.200.130
K8S-node1節(jié)點:
僅主機模式:10.10.10.201
NAT模式: ?192.168.200.131
K8S-node2節(jié)點:
僅主機模式:10.10.10.202
NAT模式: ?192.168.200.132
鏡像倉庫節(jié)點:
僅主機模式:10.10.10.101
NAT模式: ?192.168.200.150
三、版本信息
Linux內(nèi)核版本:
Linux version 3.10.0-862.el7.x86_64 (builder@kbuilder.dev.centos.org)
(gcc version 4.8.5 20150623 (Red Hat 4.8.5-28) (GCC) )
#1 SMP Fri Apr 20 16:44:24 UTC 2018
K8s集群版本為1.15.0版本:
四、基于StatefulSet與PV/PVC的MySql持久化存儲實驗
1. 在每個節(jié)點安裝nfs服務(wù)
在“鏡像倉庫”節(jié)點,執(zhí)行以下命令:
yum install -y nfs-common nfs-utils rpcbind
在k8s集群,執(zhí)行以下命令:
yum install -y nfs-utils rpcbind
2. 在“鏡像倉庫”節(jié)點下,配置nfs服務(wù)器
mkdir /nfs_mysql
Chmod?777?/nfs_mysql/
(在測試環(huán)境中,為了不考慮用戶屬性,暫時賦予777權(quán)限,但在生產(chǎn)環(huán)境不推薦這樣做)
Chown?nfsnobody?/nfs_mysql/
echo “/nfs_mysql *(rw,no_root_squash,no_all_squash,sync)”? /etc/exports
cat /etc/exports
/nfs_mysql?*(rw,no_root_squash,no_all_squash,sync)
systemctl start rpcbind
systemctl start nfs
3. 測試nfs服務(wù)是否可用
mkdir /test
showmount -e 10.10.10.101
可見/nfs_mysql *已暴露于共享目錄,接下來測試掛載是否可用:
在master節(jié)點下執(zhí)行:
mount -t nfs 10.10.10.101:/nfs_mysql /test/
echo "hello-world"/test/1.txt
在鏡像倉庫節(jié)點下查看1.txt是否存在,若存在則掛載成功:
可見nfs服務(wù)可以正常使用,接下來刪除test目錄和1.txt
在鏡像倉庫下:
[root@hub nfs_mysql]# rm -f 1.txt
在Master節(jié)點下:
[root@k8s-master ~]# umount /test/
[root@k8s-master ~]# rm -rf /test/
同理,依照以上步驟同時創(chuàng)建:(提供多個mysql副本進(jìn)行掛載)
nfs_mysql1
nfs_mysql2
完成后需要重啟nfs服務(wù)
systemctl restart rpcbind
systemctl restart nfs
最終效果:
4. 將nfs封裝成pv
創(chuàng)建mysql_test文件夾,將yaml文件統(tǒng)一保存在此目錄下
mkdir mysql_test
cd mysql_test
vim mysql-pv.yml
mysql-pv.yml配置如下:
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-pv
spec:
capacity:
storage: 5Gi
accessModes:
- ?ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: nfs
nfs:
path: /nfs_mysql
server: 10.10.10.101
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-pv1
spec:
capacity:
storage: 5Gi
accessModes:
- ?ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: nfs
nfs:
path: /nfs_mysql1
server: 10.10.10.101
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-pv2
spec:
capacity:
storage: 5Gi
accessModes:
- ?ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: nfs
nfs:
path: /nfs_mysql2
server: 10.10.10.101
注意:
在k8s集群15版本中recycle回收策略已被刪除,只能用retain策略或者Delete策略。這里我們使用 persistentVolumeReclaimPolicy: Retain
執(zhí)行命令:
kubectl create -f mysql-pv.yml
kubectl get pv
如圖所示,即為Pv創(chuàng)建成功。
5. 部署MySQL,在mysql_test目錄下編寫mysql.yml,配置文件如下
apiVersion: v1
kind: Service
metadata:
name: mysql
labels:
app: mysql
spec:
ports:
- port: 3306
name: mysql
clusterIP: None
selector:
app: mysql
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
selector:
matchLabels:
app: mysql
serviceName: "mysql"
replicas: 3
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:5.6
env:
- name: MYSQL_ROOT_PASSWORD
value: password
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumeClaimTemplates:
- metadata:
name: mysql-persistent-storage
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: "nfs"
resources:
requests:
storage: 1Gi ?
執(zhí)行以下命令,部署mysql服務(wù):
kubectl create -f mysql.yml
如圖可知,mysql按StatefulSet依次創(chuàng)建了mysql-0 mysql-1 mysql-2
查看各個Pod部在哪個節(jié)點:
6. 通過創(chuàng)建臨時容器,使用MySQL客戶端發(fā)送測試請求給MySQL master節(jié)點
注意:
主機名為mysql-0.mysql;跨命名空間的話,主機名請使用mysql-0.mysql. [NAMESPACE_NAME].如果沒有指定命名空間,默認(rèn)為default,即 mysql-0.mysql. default。
這里筆者打算關(guān)閉node2節(jié)點來模擬node2宕機,來測試是否實現(xiàn)數(shù)據(jù)的持久化存儲,
所以我們向node2上的mysql1寫入數(shù)據(jù)。
執(zhí)行以下命令,訪問mysql1:
kubectl run mysql-client --image=mysql:5.6 -it --rm --restart=Never -- mysql -h mysql-1.mysql.default -p?password
創(chuàng)建數(shù)據(jù)庫demo,并向messages表中寫入hello-world
CREATE DATABASE demo;?
CREATE TABLE demo.messages (message VARCHAR(250));?
INSERT INTO demo.messages VALUES ('hello-world');
如圖所示
接下來我們來關(guān)閉k8s-node2虛擬機,模擬宕機
查看nodes的運行狀態(tài),可知node2的狀態(tài)已轉(zhuǎn)變?yōu)镹otReady
一段時間后,k8s將Pod MySql -1遷移到節(jié)點k8s-node1
由于時間過長,筆者把三個Pod都刪除重啟后,驗證數(shù)據(jù):
MySQL服務(wù)恢復(fù),數(shù)據(jù)完好無損!
數(shù)值類型包含: int tinyint bigint float decimal
int 大整型(占 4 個字節(jié)的存儲空間)
tinyint 微小整型(占 1 個字節(jié)的存儲空間)
bigint 極大整型(占 8 個字節(jié)的存儲空間)
float 占4個字節(jié),最多顯示7個有效位。常用于成績。
float(5,2)取值范圍:
decimal 最多可以顯示 28 個有效位
存儲空間計算:整數(shù)部分和小數(shù)部分分開存儲,將 9 的倍數(shù)包裝成 4 個字節(jié),余數(shù)占用的字節(jié)數(shù)如下:
decimal 的整數(shù)位和小數(shù)位模9的余數(shù)和字節(jié)對照表
例如: decimal(19,9)
整數(shù)部分:
小數(shù)部分:
char 定長:當(dāng)列中存儲的字符串達(dá)不到最大長度時,使用空格進(jìn)行補足。
varchar 變長
char 浪費存儲空間,但性能高。 varchar 節(jié)約存儲空間,但存儲性能低。
text / longtext(4G)
數(shù)值類型寬度為顯示寬度,和占用存儲空間大小無關(guān);字符類型的寬度,超過則無法存儲:
對于枚舉類型的字段,字段值只能在列舉的范圍內(nèi)選擇。
日期時間類型: date time datetime timestamp
date 日期:
time 時間:
datetime 日期時間:
timestamp 日期時間:
日期時間函數(shù): NOW() CURDATE() CURTIME()
NOW() 返回服務(wù)器當(dāng)前的時間:
CURDATE() 返回當(dāng)前日期:
CURTIME() 返回當(dāng)前時間:
插入日期時間:
語法格式:
示例:
查詢1天以內(nèi)的記錄:
查詢2年前至今年的記錄:
? create procedure用來創(chuàng)建 存儲過程 ,create function用來創(chuàng)建 函數(shù)
? Delimiter命令是改變語句的結(jié)束符 ,MySQL默認(rèn)的結(jié)束符為;號,由于procedure和function中的;號并不代表創(chuàng)建的結(jié)束,所以要替換成另外的結(jié)束符以便表示創(chuàng)建的結(jié)束
? rontine_body子句可以包含一個簡單的SQL語句,也可以包含多個SQL語句, 通過begin…end將這多個SQL語句 包含在一起
? MySQL存儲過程和函數(shù)中也可以包含類似create和drop等DDL語句
? comment子句用來寫入對存儲過程和函數(shù)的注釋
? Language子句用來表示此存儲過程和函數(shù)的創(chuàng)建語言
? 存儲過程和函數(shù)被標(biāo)注為deterministic表明當(dāng)輸入相同的參數(shù)是會返回相同的結(jié)果,反之如果是not deterministic則表示相同參數(shù)不會是相同結(jié)果,默認(rèn)是not deterministic
? 相關(guān)屬性短語只有咨詢含義,并不是強制性的約束
? Drop procedure/function語句用來 刪除指定名稱的存儲過程或函數(shù)
? Begin…end語句通常出現(xiàn)在存儲過程、函數(shù)和觸發(fā)器中,其中 可以包含一個或多個語句 ,每個語句用;號隔開
? 標(biāo)簽label可以加在begin…end語句以及l(fā)oop, repeat和while語句
? 語句中通過iterate和leave來控制流程,iterate表示返回指定標(biāo)簽位置,leave表示跳出標(biāo)簽
? Declare語句通常用來聲明本地變量、游標(biāo)、條件或者h(yuǎn)andler
? Declare語句只允許出現(xiàn)在begin … end語句中而且必須出現(xiàn)在第一行
? Declare的順序也有要求,通常是先聲明本地變量,再是游標(biāo),然后是條件和handler
? 本地變量可以通過declare語句進(jìn)行聲明
? 聲明后的變量可以通過select … into var_list進(jìn)行賦值,或者通過set語句賦值,或者通過定義游標(biāo)并使用fetch … into var_list賦值
? 通過declare聲明變量方法:
? MySQL支持if,case,iterate,leave,loop,while,repeat語句作為存儲過程和函數(shù)中的 流程控制語句 ,另外return語句也是函數(shù)中的特定流程控制語句
? Case語句在存儲過程或函數(shù)中表明了 復(fù)雜的條件選擇語句
? IF語句在存儲過程或函數(shù)中表明了 基礎(chǔ)的條件選擇語句
其中在 function 里面,只有 DETERMINISTIC, NO SQL 和 READS SQL DATA 被支持。如果我們開啟了 bin-log, 我們就必須為我們的 function 指定一個參數(shù)。
在 MySQL 中創(chuàng)建函數(shù)時出現(xiàn)這種錯誤的解決方法:
set global log_bin_trust_function_creators=TRUE;
? Iterate語句 僅出現(xiàn)在loop,repeat,while循環(huán)語句中,其含義表示重新開始此循環(huán)
? Leave語句表明 退出指定標(biāo)簽的流程控制語句塊
? 通常會用在begin…end,以及l(fā)oop,repeat,while的循環(huán)語句中
? Loop語句是存儲過程或函數(shù)中表達(dá) 循環(huán)執(zhí)行 的一種方式
? repeat語句是存儲過程或函數(shù)中表達(dá) 循環(huán)執(zhí)行 的一種方式
? while語句是存儲過程或函數(shù)中表達(dá) 循環(huán)執(zhí)行 的一種方式
? Return語句用在 函數(shù)中,用來終結(jié)函數(shù)的執(zhí)行并將指定值返回給調(diào)用者
? Cursor游標(biāo)用來 聲明一個數(shù)據(jù)集
? 游標(biāo)的聲明必須在變量和條件聲明之后,在handler聲明之前
? Cursor close語句用來 關(guān)閉之前打開的游標(biāo)
? Cursor declare語句用來聲明一個游標(biāo)和指定游標(biāo)對應(yīng)的數(shù)據(jù)集合, 通常數(shù)據(jù)集合是一個select語句
? Cursor fetch語句用來獲取游標(biāo)指定數(shù)據(jù)集的 下一行數(shù)據(jù) 并將各個字段值賦予后面的變量
? Open cursor語句用來打開一個之前已經(jīng) 聲明好的游標(biāo)
? Declare condition語句命名 特定的錯誤條件 ,而該特定錯誤可以在declare…h(huán)andler中指定 處理方法
? 比如在MySQL中1051error code表示的是unknown table的錯誤,如果要對這
個錯誤做特殊處理,可以用三種方法:
? Declare handler語句用來聲明一個handler來處理一個或多個特殊條件,當(dāng)其中的某個條件滿足時則觸發(fā)其中的statement語句執(zhí)行
? Statement可以是一個簡單SQL語句,也可以是begin…end組成的多個語句
? Handler_action子句聲明當(dāng)執(zhí)行完statement語句之后應(yīng)該怎么辦
Condition_value的值有以下幾種:
? 當(dāng)condition發(fā)生但沒有聲明handler時,則存儲過程和函數(shù)依照如下規(guī)則處理
? create trigger語句用來創(chuàng)建一個觸發(fā)器,觸發(fā)器的作用是當(dāng)表上有對應(yīng)SQL語句發(fā)生時,則觸發(fā)執(zhí)行
? 觸發(fā)器創(chuàng)建時需要 指定對應(yīng)的表名 tbl_name
? Definer關(guān)鍵詞用來指定trigger的安全環(huán)境
? Trigger_time指定觸發(fā)器的執(zhí)行時間,BEFORE和AFTER指定觸發(fā)器在表中的 每行數(shù)據(jù)修改前或者后 執(zhí)行
? Trigger_event指定觸發(fā)該觸發(fā)器的具體 事件
? INSERT當(dāng)新的一行數(shù)據(jù)插入表中時觸發(fā),比如通過執(zhí)行insert,load data,replace語句插入新數(shù)據(jù)
? UPDATE當(dāng)表的一行數(shù)據(jù)被修改時觸發(fā),比如執(zhí)行update語句時
? DELETE當(dāng)表的一行數(shù)據(jù)被刪除時觸發(fā),比如執(zhí)行delete,replace語句時
? 當(dāng)執(zhí)行insert into … on duplicate key update語句時,當(dāng)碰到重復(fù)行執(zhí)行update時,則觸發(fā)update下的觸發(fā)器
? 從5.7.2版本開始,可以創(chuàng)建具有相同trigger_time和trigger_event的同一個表上的多個觸發(fā)器,默認(rèn)情況下按照創(chuàng)建的時間依次執(zhí)行,通過 指定FOLLOWS/PRECEDES改變執(zhí)行順序 ,即FOLLOWS時表示新創(chuàng)建的觸發(fā)器后執(zhí)行,PRECEDES則表示新觸發(fā)器先執(zhí)行
? Trigger_body表示觸發(fā)器觸發(fā)之后要執(zhí)行的一個或多個語句,在內(nèi)部可以引用涉及表的字段, OLD.col_name表示行數(shù)據(jù)被修改或刪除之前的字段數(shù)據(jù),NEW.col_name表示行數(shù)據(jù)被插入或修改之后的字段數(shù)據(jù)
? Drop trigger語句用來 刪除一個觸發(fā)器
? If exists短語用來避免刪除不存在的觸發(fā)器時引發(fā)報錯
? 當(dāng)你執(zhí)行drop table時,表上的觸發(fā)器也被drop掉了