前提條件
創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括麥蓋提網(wǎng)站建設(shè)、麥蓋提網(wǎng)站制作、麥蓋提網(wǎng)頁制作以及麥蓋提網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,麥蓋提網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到麥蓋提省份的部分城市,未來相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
您需要在您RDS for MySQL所在的云賬號(hào)下開通阿里云數(shù)據(jù)傳輸服務(wù)。并 點(diǎn)擊此處
下載dts-ads-writer插件到您的一臺(tái)服務(wù)器上并解壓(需要該服務(wù)器可以訪問互聯(lián)網(wǎng),建議使用阿里云ECS以最大限度保障可用性)。服務(wù)器上需要有Java
6或以上的運(yùn)行環(huán)境(JRE/JDK)。
操作步驟
1. 在分析型數(shù)據(jù)庫上創(chuàng)建目標(biāo)表,數(shù)據(jù)更新類型為實(shí)時(shí)寫入,字段名稱和MySQL中的建議均相同;
2. 在阿里云數(shù)據(jù)傳輸?shù)目刂婆_(tái)上創(chuàng)建數(shù)據(jù)訂閱通道,并記錄這個(gè)通道的ID;
(見: ),
3. 配置dts-ads-writer/app.conf文件,配置方式如下:
所有配置均保存在app.conf中,運(yùn)行前請(qǐng)保證配置正確;修改配置后,請(qǐng)重啟writer
基本配置:
{
"dtsAccessId": "", // 擁有數(shù)據(jù)訂閱通道的云賬號(hào)的accessId, 必須配置
"dtsAccessKey": "", // 擁有數(shù)據(jù)訂閱通道的云賬號(hào)的accessKey, 必須配置
"dtsTunnelId": "", // 數(shù)據(jù)訂閱通道的id, 必須配置; 注意是id,不是通道名稱
"adsUserName": "", // 訪問您的分析型數(shù)據(jù)庫的用戶名(accessId), 必須配置
"adsPassword": "", // 訪問您的分析型數(shù)據(jù)庫的密碼(accessKey), 必須配置
"adsJdbcUrl": "", // 訪問分析型數(shù)據(jù)庫的jdbc連接串, 必須配置(格式j(luò)dbc:mysql://ip:port/dbname)
"tables": [
{
"source": {
"primaryKeys": [""] // 主鍵定義, 必須配置; 注意RDS和分析型數(shù)據(jù)庫中的主鍵定義必須一致
"db": "", // 源頭RDS的db名稱, 必須配置
"table": "", // 源頭RDS的table名稱, 必須配置
"skipColumns": ["col1"] // 可選,若在此配置了RDS表某列名,則該列不會(huì)同步
},
"target": {
"table": "" // 分析型數(shù)據(jù)庫表的table名稱, 必須配置
},
"columnMapping": {
"": "" // rds表和ads表的列對(duì)應(yīng)關(guān)系:key為rds的列名, value為分析型數(shù)據(jù)庫的列名,選填,不填則按照列名一一對(duì)應(yīng)
}
}
]
}
tables節(jié)點(diǎn)的配置示例,
表示rds_db庫下的rds_table表對(duì)應(yīng)ads_table表,并且rds_table表的col1列對(duì)應(yīng)ads_table表的col1_ads列,
rds_table表的col2列對(duì)應(yīng)ads_table表的col2_ads列
"tables": [
{
"source": {
"primaryKeys": [
"col1",
"col2"
],
"db": "rds_db",
"table": "rds_table"
},
"target": {
"table": "ads_table"
},
"columnMapping": {
"col1": "col1_ads",
"col2": "col2_ads"
}
}
]
注意事項(xiàng):
1)RDS for MySQL表和分析型數(shù)據(jù)庫中表的主鍵定義必須完全一致;如果不一致會(huì)出現(xiàn)數(shù)據(jù)不一致問題。如果需要調(diào)整RDS/分析型數(shù)據(jù)庫表的主鍵,建議先停止writer進(jìn)程;
2)一個(gè)插件進(jìn)程中分析型數(shù)據(jù)庫db只能是一個(gè),由adsJdbcUrl指定;
3)一個(gè)插件進(jìn)程只能對(duì)應(yīng)一個(gè)數(shù)據(jù)訂閱通道;如果更新通道中的訂閱對(duì)象時(shí),需要重啟進(jìn)程
4)RDS for MySQL中DDL操作不做同步處理;
5)更新app.conf需要重啟插件進(jìn)程才能生效;
6)如果工具出現(xiàn)bug或某種其它原因需要重新同步歷史數(shù)據(jù),只能回溯最近24小時(shí)的數(shù)據(jù)(在阿里云數(shù)據(jù)傳輸?shù)目刂婆_(tái)中修改消費(fèi)位點(diǎn));
7)插件的最大同步性能與運(yùn)行插件的服務(wù)器的互聯(lián)網(wǎng)帶寬和磁盤IOPS成正比。
4. 運(yùn)行dts-ads-writer/bin/startup.sh(sh bin/startup.sh);
5. 配置監(jiān)控程序監(jiān)控進(jìn)程存活和日志中的常見錯(cuò)誤碼。
logs目錄下的日志中的異常信息均以ErrorCode=XXXX ErrorMessage=XXXX形式給出,可以進(jìn)行監(jiān)控
根據(jù)無窮遞縮等比數(shù)列的
所有各項(xiàng)之和的公式:
無窮遞縮等比數(shù)列{an}中,
若a1=a,公比為q(lql1),
那么各項(xiàng)之和為
S=a/(1一q)!
所以有
1+1/2+1/4+……
=1/(1一1/2)=2。
把后綴為.sql的命令文件導(dǎo)入數(shù)據(jù)庫 source d:/1.sql; 注意:要先選擇一個(gè)數(shù)據(jù)庫,要不不能導(dǎo)入的.
一、關(guān)鍵字執(zhí)行順序
1、查詢中用到的關(guān)鍵詞主要包含六個(gè),并且他們的順序依次為 :
select--from--where--group by--having--order by 其中select和from是必須的,其他關(guān)鍵詞是可選的。
這六個(gè)關(guān)鍵詞的執(zhí)行順序,與sql語句的書寫順序并不是一樣的,而是按照下面的順序來執(zhí)行
from--where--group by--having--select--order by。
注意:雖然select在having后執(zhí)行,但是mysql中仍然可以在having中使用select語句定義的別名。
原因分析:mysql在查詢的時(shí)候會(huì)產(chǎn)生一個(gè)臨時(shí)表,所有的字段名稱(別名)在臨時(shí)表中已經(jīng)產(chǎn)生,產(chǎn)生了臨時(shí)表之后才會(huì)進(jìn)行having操作。也就是說mysql內(nèi)部有一定的解析順序,解析順序select優(yōu)先于having。在這里我個(gè)人認(rèn)為是mysql可能沒有將這一點(diǎn)做規(guī)范。Oracle中having無法使用select語句內(nèi)的別名。
2、insert into 和replace into和merge into
insert into是mysql的基本插入語句。replace into 是mysql中的代替插入語句,可以理解為insert into的升級(jí)版。replace into在執(zhí)行的時(shí)候,首先會(huì)根據(jù)指定的主鍵或者唯一索引判斷當(dāng)前表中是否存在指定的主鍵或索引,如果主鍵或唯一索引已經(jīng)存在,則先將對(duì)應(yīng)的索引的數(shù)據(jù)刪除,然后在索引位置插入replace into中包含的數(shù)據(jù)。如果主鍵和唯一索引沒有存在,則直接在索引位置插入replace into中包含的數(shù)據(jù)。merge into 是oracle數(shù)據(jù)庫中的代替插入語句。實(shí)現(xiàn)方式和replace into類似。執(zhí)行效率:如果指定索引位置沒有數(shù)據(jù),insert into和replace into執(zhí)行效率相差無幾,二者效率相同。如果指定位置索引已經(jīng)存在,insert into語句不能正常執(zhí)行,replace into語句可以正常執(zhí)行。注意:雖然replace into比較好使用,但是也存在一定風(fēng)險(xiǎn):replace每次要重新分配自增id;replace中執(zhí)行delete時(shí), 在有外鍵的情況下會(huì)很麻煩;如果delete時(shí)定義的有觸發(fā)器, 則會(huì)被執(zhí)行;副作用也會(huì)被傳播到replica slave.推薦使用INSERT INTO … ON DUPLICATE KEY UPDATEON DUPLICATE KEY UPDATE是mysql特有的一個(gè)sql關(guān)鍵字,只能在mysql中使用。
在MySQL數(shù)據(jù)庫中,如果在insert語句后面帶上ON DUPLICATE KEY UPDATE 子句,而要插入的行與表中現(xiàn)有記錄的惟一索引或主鍵中產(chǎn)生重復(fù)值,那么就會(huì)發(fā)生舊行的更新;如果插入的行數(shù)據(jù)與現(xiàn)有表中記錄的唯一索引或者主鍵不重復(fù),則執(zhí)行新紀(jì)錄插入操作。
比如有這樣一張表:
create table func(id int primary key,count int,birthday date);
insert into func values(1,1,'1990-09-09');--插入一條數(shù)據(jù)
insert into func values(1,1,'1990-09-09') on duplicate key update count = count+1;--表中有數(shù)據(jù),刪除原表數(shù)據(jù),將新數(shù)據(jù)插入。
提示兩行受到影響,說明先執(zhí)行的刪除操作,然后插入新的數(shù)據(jù)。
觀察到?jīng)]有任何新數(shù)據(jù)插入,count字段被更新。(count字段更新是因?yàn)閯倓偟牟迦胝Z句中書寫了update count = count+1;)
如果不希望任何字段更新,可以寫成如下格式:
insert into func values(1,1,'1990-09-09') on duplicate key update count = values(count);--再次執(zhí)行,沒有新數(shù)據(jù)插入到數(shù)據(jù)庫中。
二、mysql內(nèi)置函數(shù)
內(nèi)置函數(shù)眾多,不需要每一個(gè)都掌握,熟練掌握幾個(gè)在以后使用即可??梢圆榭磎ysql官方文檔學(xué)習(xí)內(nèi)置函數(shù)。
三、其它注意事項(xiàng)
1、在已經(jīng)存在的表中添加外鍵。(僅作為了解內(nèi)容)
alter table tb_name add constraint fk_name foreign key (tb_name.id) references tb_stu(id);
例如:alter table emp add constraint forkey foreign key(dept_id) references dept(id);
該語句是在 tb_name表上添加一個(gè)外鍵約束,引用 tb_stu的主鍵,fk_name是約束的名字。
刪除約束:alter table tb_name drop constraint fk_name ;
2、外鍵的使用情景:
在不要求吞吐速度而對(duì)數(shù)據(jù)的正確性和安全性要求較高時(shí),推薦使用外鍵。
如果面對(duì)高吞吐量,要求優(yōu)先保證讀取效率時(shí),則不推薦使用外鍵。
3、刪除的時(shí)候使用別名:
原句:delete from employee where id = 1;
別名:delete e from employee as e where id =1;
用shell腳本通過while循環(huán)批量生成mysql測(cè)試數(shù)據(jù)的方法。
1、很多時(shí)候需要在mysql表中插入大量測(cè)試數(shù)據(jù),下面分享一個(gè)用shell腳本通過while循環(huán)批量生成mysql測(cè)試數(shù)據(jù)的方法,你只需要根據(jù)你自己的表結(jié)構(gòu)來生成sql語句即可。
復(fù)制代碼代碼如下:
#!/bin/bash
i=1;
MAX_INSERT_ROW_COUNT=$1;
while [ $i -le $MAX_INSERT_ROW_COUNT ]
do
mysql -uroot -proot afs -e "insert into afs_test (name,age,createTime) values ('HELLO$i',$i % 99,NOW());"
d=$(date +%M-%d\ %H\:%m\:%S)
echo "INSERT HELLO $i @@ $d"
i=$(($i+1))
sleep 0.05
done
exit 0
2、假定上面的shell腳本保存為create-data.sh,可以通過下面的命令來生成數(shù)據(jù):
復(fù)制代碼代碼如下:sh create-data.sh 10000。(參數(shù)10000是要生成的數(shù)據(jù)條數(shù)。)