




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、分布式關(guān)系型數(shù)據(jù)庫(kù) DRDS開(kāi)發(fā)手冊(cè)DRDS/開(kāi)發(fā)手冊(cè)DRDS/開(kāi)發(fā)手冊(cè) PAGE 50 PAGE 50開(kāi)發(fā)手冊(cè)DRDS慢SQL查詢本文檔主要描述如何通過(guò)連接DRDS服務(wù)排查慢SQL。TIPS1.建議通過(guò)mysql命令行進(jìn)行連接,mysql -hip -Pport -uuser -ppassword -c,最后-c請(qǐng)務(wù)必帶上,讓mysql客戶端將注釋下發(fā)2.如果碰到命令報(bào)錯(cuò),請(qǐng)執(zhí)行select version(),并且工單反饋,由我們來(lái)幫你升級(jí)實(shí)例版本,老版本實(shí)例可能存在部分指令異常1.查看慢sql top10+XXX rows in set (0.22 sec)+XXX rows in se
2、t (0.22 sec)|1|SELECTcount(*)ASTotalCountFROM547408 |test_db|2015-10-1315:34:00|App_PhoneKeyASiINNERJOINApp_A.App_Applicatione.|5|SELECT*FROMApp_CarCardASiINNERJOIN707314 |0 | CREATE INDEX i_DomainName ON768825 |test_db|2015-10-1308:21:43|App_AuditStatistics ( DomainName)|test_db|2015-10-1315:49:22|
3、+|test_db|2015-10-1315:45:03|1049429|10|SELECT*FROMApp_IdentityCardASiINNER JOINApp_Applicati.|test_db|2015-10-1315:37:34|955541|1 | SELECT count(*) AS TotalCountFROMApp_CarCard AS iINNERJOIN.|test_db|2015-10-1308:37:26|943829|0 | CREATE INDEX i_UpdateTime ONApp_AuditStatistics ( DomainName, UpdateT
4、ime) |EXECUTE_TIME|AFFECT_ROW|SQL| SCHEMA | START_TIME| HOST|mysql show slow;+如果已經(jīng)有明確的慢SQL,直接跳到第二步。2.查看DRDS執(zhí)行計(jì)劃DRDS提供的explain指令執(zhí)行結(jié)果會(huì)顯示這個(gè)SQL具體在哪幾個(gè)分片上執(zhí)行,然后具體在數(shù)據(jù)節(jié)點(diǎn)上執(zhí)行的SQL是什么, 執(zhí)行的策略是什么等等信息。我們將這些信息叫做DRDS的執(zhí)行計(jì)劃,這個(gè)信息是靜態(tài)的,并沒(méi)有真正在數(shù)據(jù)庫(kù)上執(zhí)行。mysql explain detail select * from App_ChartAuditTrend limit 1;+| TEST_000
5、0_RDS | Merge as App_ChartAuditTrend limitFrom:0limitTo:1 queryConcurrency:SEQUENTIALcolumns:App_ChartAuditTrend.Id, App_ChartAuditTrend.DomainName, App_ChartAuditTrend.UpdateTime, App_ChartAuditTrend.Url, App_ChartAuditTrend.AllNum, App_ChartAuditTrend.IdentityNum, App_ChartAuditTrend.CarNum, App_C
6、hartAuditTrend.PhoneNumexecuteOn:YUANWANG_CAS_1444638155126TKJWYUANWANG_CAS_ZJRX_0000_RDSQuery from App_ChartAuditTrend as App_ChartAuditTrend limitFrom:0limitTo:1 queryConcurrency:SEQUENTIALcolumns:App_ChartAuditTrend.Id, App_ChartAuditTrend.DomainName, App_ChartAuditTrend.UpdateTime, App_ChartAudi
7、tTrend.Url, App_ChartAuditTrend.AllNum, App_ChartAuditTrend.IdentityNum, App_ChartAuditTrend.CarNum, App_ChartAuditTrend.PhoneNumtableName:App_ChartAuditTrend executeOn:YUANWANG_CAS_1444638155126TKJWYUANWANG_CAS_ZJRX_0000_RDSQuery from App_ChartAuditTrend as App_ChartAuditTrend limitFrom:0limitTo:1
8、queryConcurrency:SEQUENTIALcolumns:App_ChartAuditTrend.Id, App_ChartAuditTrend.DomainName, App_ChartAuditTrend.UpdateTime, App_ChartAuditTrend.Url, App_ChartAuditTrend.AllNum, App_ChartAuditTrend.IdentityNum, App_ChartAuditTrend.CarNum, App_ChartAuditTrend.PhoneNumtableName:App_ChartAuditTrend execu
9、teOn:YUANWANG_CAS_1444638155126TKJWYUANWANG_CAS_ZJRX_0001_RDSQuery from App_ChartAuditTrend as App_ChartAuditTrend limitFrom:0limitTo:1 queryConcurrency:SEQUENTIALcolumns:App_ChartAuditTrend.Id, App_ChartAuditTrend.DomainName, App_ChartAuditTrend.UpdateTime, App_ChartAuditTrend.Url, App_ChartAuditTr
10、end.AllNum, App_ChartAuditTrend.IdentityNum, App_ChartAuditTrend.CarNum, App_ChartAuditTrend.PhoneNumtableName:App_ChartAuditTrend executeOn:YUANWANG_CAS_1444638155126TKJWYUANWANG_CAS_ZJRX_0002_RDS.+mysql show node;+里面所顯示的XXXX_RDS代表數(shù)據(jù)分片,具體對(duì)應(yīng)的庫(kù)可以通過(guò)show node和show datasourcse兩個(gè)命令得mysql show node;+| ID
11、|NAME|MASTER_READ_COUNT|SLAVE_READ_COUNT|MASTER_READ_PERCENT| SLAVE_READ_PERCENT|+| 0 |TEST_0032_RDS|51|0|100%|0%| 1 |TEST_0033_RDS|43|0|100%|0%| 2 |TEST_0034_RDS|43|0|100%|0%| 3 |TEST_0035_RDS|43|0|100%|0%| . |.|.|.|100%|0%|+XX rows in set (0.36 sec)mysql show datasources;+| ID | SCHEMA |NAME|GROUP
12、|URL| USER | TYPE | INIT | MIN | MAX | IDLE_TIMEOUT | MAX_WAIT | ACTIVE_COUNT | POOLING_COUNT|+| 0 | test_db | test_db_0032_imnc_59 | TEST_0032_RDS | jdbc:mysql:/ip:3306/test_0032| user1 | mysql | 0 | 1 | 150 |1|5000|0|3| 1 | test_db | test_db_0033_imnc_108 | TEST_0033_RDS | jdbc:mysql:/ip:3306/test
13、_0033| user1 | mysql | 0 | 1 | 150 |1|5000|1|2| 2 | test_db | test_db_0034_imnc_47 | TEST_0034_RDS | jdbc:mysql:/ip:3306/test_0034| user1 | mysql | 0 | 1 | 150 |1|5000|1|2|+XXX rows in set (0.23 sec)3.跟蹤sql執(zhí)行過(guò)程在得到大致SQL的執(zhí)行范圍和策略的之后,我們就需要實(shí)際跟蹤下這個(gè)SQL在各個(gè)DRDS組件和底下的數(shù)據(jù)分片 DRDS,也可以一開(kāi)始上來(lái)就直接執(zhí)行trace命令。TIPS一開(kāi)始之所以建
14、議大家直接使用MySQL官方命令行,其中一個(gè)原因就是像DRDS trace命令需要保持連接的上下文信息,而某些GUI客戶端可能會(huì)使用連接池,導(dǎo)致命令不正常。mysql trace /!TDDL:SOCKET_TIMEOUT=0*/select * from App_IdentityCard limit 1;+|DomainName|mysql trace /!TDDL:SOCKET_TIMEOUT=0*/select * from App_IdentityCard limit 1;+|DomainName|ApplicationId|UpdateTime|IdentityCard|+|sdfs
15、dfdsfsdfsdfsdfsdf| 6205076500132922050 | 2015-10-13 18:25:57 | 000000263180292197|+1 row in set (0.35 sec)執(zhí)行完畢后,執(zhí)行以下命令查看結(jié)果,你可以看到每個(gè)數(shù)據(jù)分片(類似XXX_RDS)的執(zhí)行時(shí)長(zhǎng),以及DRDS層面的主要組件時(shí)間消耗。 一般情況下,如果數(shù)據(jù)分片執(zhí)行時(shí)間相對(duì)過(guò)長(zhǎng),需要注意排查3個(gè)事情。1.數(shù)據(jù)庫(kù)上的執(zhí)行計(jì)劃是否對(duì)。2.到數(shù)據(jù)庫(kù)上執(zhí)行的SQL是否返回大量數(shù)據(jù)。 3.DRDS是否存在類似mergesort,temptablemerge等耗時(shí)操作。+1 row in set (0.3
16、5 sec)|0 | select App_IdentityCard.DomainName,App_Id.| NULL | .|.|.|2|0.01| 1 | Query | TEST_0000_RDS |10|6.00| 0 |selectApp_IdentityCard.DomainName,App_Id.| NULL | 2 | Query | TEST_0000_RDS |1|0.02| 0 |selectApp_IdentityCard.DomainName,App_Id.| NULL| 0 | /*+TDDL(extra:SOCKET_TIMEOUT:0)*/selec.| 0.0
17、0| 175| 0 | Optimize | DRDS NULL |+|TIME_COST(MS)|CONNECTION_TIME_COST(MS)|ROWS|STATEMENT| DATA_NODE| ID | TYPE| PARAMS |mysql show trace;+另外關(guān)于數(shù)據(jù)庫(kù)上執(zhí)行的狀況,我們也可以通過(guò)打開(kāi)另外一個(gè)命令行,執(zhí)行show processlist 命令來(lái)查看底下數(shù)據(jù)庫(kù)中正在執(zhí)行的SQL詳情mysql show processlist;mysql show processlist;+|ID|USER|DB| COMMAND | TIME|STATE|INFO| ROW
18、S_SENT| ROWS_EXAMINED | ROWS_READ|+| 0-0-73777 | ftwobwdf0 | yuanwang_cas_zjrx_0038 | Sleep | 58|NULL|NULL| NULL|NULL| 0-0-78566 | ftwobwdf0 | yuanwang_cas_zjrx_0038 | Query | 0 | query end | insert into App_IdentityCard_286 (D|NULL|NULL|NULL| 0-0-78834 | ftwobwdf0 | yuanwang_cas_zjrx_0032 | Sleep |
19、 1|NULL|NULL| NULL|NULL| 0-0-78843 | ftwobwdf0 | yuanwang_cas_zjrx_0036 | Sleep | 0|NULL|NULL| NULL|NULL| 0-0-79031 | ftwobwdf0 | yuanwang_cas_zjrx_0035 | Sleep | 0|NULL|NULL| NULL|NULL| 0-0-79166 | ftwobwdf0 | yuanwang_cas_zjrx_0035 | Sleep | 17|NULL|NULL| NULL|NULL| 0-0-79477 | ftwobwdf0 | yuanwan
20、g_cas_zjrx_0039 | Query | 0 | query end | insert into App_IdentityCard_286 (D|NULL|NULL|NULL| 0-0-79636 | ftwobwdf0 | yuanwang_cas_zjrx_0037 | Sleep | 0|NULL|NULL| NULL|NULL|NULLNULL|NULL| 0-0-79889 | ftwobwdf0 | yuanwang_cas_zjrx_0034 | Sleep | 0|NULL|NULL| NULL|NULL|+XXX rows in set (0.35 sec)|NUL
21、L| NULL| 0-0-79639 | ftwobwdf0 | yuanwang_cas_zjrx_0032 | Sleep | 0 |mysql kill 0-0-79477;這里順帶提下kill指令,目前DRDS層面還沒(méi)有根據(jù)邏輯SQL執(zhí)行kill命令的,這個(gè)后續(xù)需求中會(huì)做掉,但是并不 意味著DRDS這邊不能做kill,實(shí)際 操作這個(gè)命令還是非常有效和直接的,DRDS會(huì)聚合所有當(dāng)前DRDS數(shù)據(jù)庫(kù)對(duì)應(yīng)的數(shù)據(jù)分片,并將這些分片每個(gè)processlist進(jìn)行展現(xiàn),并且能夠直接 通過(guò)以下命令kill 相關(guān)分片上的某一個(gè)執(zhí)行.mysql kill 0-0-79477;4.查看RDS/MYSQL執(zhí)行
22、計(jì)劃DRDS層面的,可以找到我們進(jìn)行咨詢,看怎 么改SQL,如果是RDS層面也比較慢, 我們可以先通過(guò)執(zhí)行以下兩個(gè)命令進(jìn)行數(shù)據(jù)庫(kù)層面的執(zhí)行計(jì)劃查看,注意,如果您使用mysql命令行連接DRDS,請(qǐng)?jiān)趩?dòng)參數(shù)中加入-c,否則注釋會(huì)被命令行過(guò)濾掉:mysql /*TDDL:node=0*/explain select * from tddl5_users_00;+mysql /*TDDL:node=0*/explain select * from tddl5_users_00;+| id | select_type|table| type | possible_keys | key | key_l
23、en | ref | rows | Extra|+| 1|SIMPLE| tddl5_users_00 | ALL |NULL| NULL| NULL | NULL| 1|+1 row in set (0.02 sec)查看所有分庫(kù)上的執(zhí)行計(jì)劃分庫(kù)不分表:mysql /*TDDL:scan*/explain select * from tddl6_users;+| id | select_typemysql /*TDDL:scan*/explain select * from tddl6_users;+| id | select_type|table| type | possible_keys
24、 | key | key_len | ref | rows | Extra|+| 1|SIMPLE| tddl6_users | ALL |NULL| NULL| NULL | NULL| 1| 1|SIMPLE| tddl6_users | ALL |NULL| NULL| NULL | NULL| 1| 1|SIMPLE| tddl6_users | ALL |NULL| NULL| NULL | NULL| 1| 1|SIMPLE| tddl6_users | ALL |NULL| NULL| NULL | NULL| 1|+4 rows in set (0.02 sec)mysql /
25、*TDDL:scan=tddl5_users*/explain select * from tddl5_users;+| id | select_typemysql /*TDDL:scan=tddl5_users*/explain select * from tddl5_users;+| id | select_type|table| type | possible_keys | key | key_len | ref | rows | Extra|+| 1|SIMPLE| tddl5_users | ALL |NULL| NULL| NULL | NULL| 1| 1|SIMPLE| tdd
26、l5_users | ALL |NULL| NULL| NULL | NULL| 1| 1|SIMPLE| tddl5_users | ALL |NULL| NULL| NULL | NULL| 1| 1|SIMPLE| tddl5_users | ALL |NULL| NULL| NULL | NULL| 1| 1|SIMPLE| tddl5_users | ALL |NULL| NULL| NULL | NULL| 1| 1|SIMPLE| tddl5_users | ALL |NULL| NULL| NULL | NULL| 1| 1|SIMPLE| tddl5_users | ALL
27、|NULL| NULL| NULL | NULL| 1| 1|SIMPLE| tddl5_users | ALL |NULL| NULL| NULL | NULL| 1| 1|SIMPLE| tddl5_users | ALL |NULL| NULL| NULL | NULL| 1| 1|SIMPLE| tddl5_users | ALL |NULL| NULL| NULL | NULL| 1| 1|SIMPLE| tddl5_users | ALL |NULL| NULL| NULL | NULL| 1| 1|SIMPLE| tddl5_users | ALL |NULL| NULL| NU
28、LL | NULL| 1| 1|SIMPLE| tddl5_users | ALL |NULL| NULL| NULL | NULL| 1| 1|SIMPLE| tddl5_users | ALL |NULL| NULL| NULL | NULL| 1| 1|SIMPLE| tddl5_users | ALL |NULL| NULL| NULL | NULL| 1| 1|SIMPLE| tddl5_users | ALL |NULL| NULL| NULL | NULL| 1|+16 rows in set (0.32 sec)TIPS以上三條注釋也對(duì)其他SQL有效,如果有碰到不支持的,請(qǐng)反饋
29、給我們。5.查看索引和RDS數(shù)據(jù)庫(kù)診斷報(bào)告|mysql show create table App_ChartAuditTrend;+|mysql show create table App_ChartAuditTrend;+|Table|CreateTable|+| App_ChartAuditTrend | CREATE TABLE App_ChartAuditTrend (Id bigint(20) NOT NULL AUTO_INCREMENT,DomainName varchar(30) DEFAULT NULL,UpdateTime datetime DEFAULT NULL,Ur
30、l varchar(500) DEFAULT NULL,AllNum int(11) DEFAULT NULL,IdentityNum int(11) DEFAULT NULL,CarNum int(11) DEFAULT NULL,PhoneNum int(11) DEFAULT NULL, PRIMARY KEY (Id) ENGINE=TokuDB DEFAULT CHARSET=utf8 dbpartition by hash(DomainName)+1 row in set (0.05 sec)6.調(diào)整DRDS的SQLDRDS層面的SQL調(diào)優(yōu)主要記住幾個(gè)原則。1.盡量帶上拆分字段,減
31、少數(shù)據(jù)的查詢范圍,等值、in、有限范圍都比不帶的要好。2.盡可能帶上過(guò)濾條件或者有效的過(guò)濾條件將返回的數(shù)據(jù)量降低。3.如果兩表join或者多表join, 嘗試對(duì)join的表進(jìn)行位置互換(保持語(yǔ)義的情況下)。7.理解DRDS的SQL主要會(huì)消耗在什么地方以及調(diào)優(yōu)a.DRDS層面除了需要做比較重的heap sort或者h(yuǎn)eap computer的時(shí)候會(huì)比較費(fèi)時(shí)(從trace中能夠看到,并且絕大部分sql DRDS會(huì)避免此種計(jì)算),其他大部分對(duì)sql的處理操作都不會(huì)占用太多資源和時(shí)間損耗,需要注意的時(shí)候,無(wú)論從RDS到DRDS返回大量數(shù)據(jù)進(jìn)行merge還是從DRDS返回大量結(jié)果給客戶端,都會(huì)帶來(lái)比較大
32、延遲 和資源損耗,所以建議控制返回結(jié)果的大小。b.如果從tracesql里面獲得的時(shí)間在RDS上消耗比較大,請(qǐng)首先觀察RDS的狀態(tài),包括幾個(gè)大的指標(biāo)iops,cpu,內(nèi)存,以及mysql自身指標(biāo):連接數(shù)、鎖、buffer消耗等,然后請(qǐng)務(wù)必看RDS的診斷報(bào)告,大部分 sql進(jìn)行參數(shù)調(diào)優(yōu),這個(gè)需要專業(yè)DBA介入,RDS有部分參數(shù) 的修改界面。c.對(duì)于一些類分析的sql操作,建議能夠做結(jié)果或者中間結(jié)果緩存,mysql的存儲(chǔ)特性決定如果純粹在MySQL做 所有業(yè)務(wù)操作,可能會(huì)導(dǎo)致連鎖反應(yīng),甚至原本很快的一個(gè)insert操作都會(huì)變得非常緩慢,所以嘗試減輕數(shù)據(jù)庫(kù) 的負(fù)擔(dān)減小比較重的sql操作的qps或者執(zhí)
33、行復(fù)雜度。DRDS慢日志明細(xì)簡(jiǎn)介默認(rèn)情況下,DRDS的每一個(gè)節(jié)點(diǎn),會(huì)記錄5000條慢SQL明細(xì)(邏輯慢SQL和物理慢SQL加一塊5000條),例 如,如果您的規(guī)格是4C4G,則有兩個(gè)DRDS節(jié)點(diǎn),會(huì)記錄5000 x2=10000條慢SQL明細(xì)。當(dāng)慢SQL數(shù)目多于限制數(shù)目的時(shí)候,會(huì)滾動(dòng)刪除老的日志。DRDS中定義執(zhí)行時(shí)間超過(guò)1s的SQL為慢SQL。SHOW FULL SLOW | PHYSICAL_SLOW WHERE where_conditionORDER BY col_name ASC | DESC, .SHOW FULL SLOW | PHYSICAL_SLOW WHERE where_
34、conditionORDER BY col_name ASC | DESC, .LIMIT offset, row_count | row_count OFFSET offset解釋SHOW FULL SLOW顯示的是邏輯慢SQL,即您的應(yīng)用發(fā)送到DRDS的SQL;SHOW FULL PHYSICAL_SLOW指的是物理慢SQL,即DRDS發(fā)送到RDS的SQL。其中SHOW FULL SLOW的結(jié)果集會(huì)包含以下列,其含義如下:同,同時(shí)TRACE_ID也會(huì)以注釋的形式發(fā)送到RDS,在RDS的SQL明細(xì)中可以根據(jù)TRACE_ID找到該SQL HOST: 發(fā)送該SQL的客戶端的IP同,同時(shí)TRACE
35、_ID也會(huì)以注釋的形式發(fā)送到RDS,在RDS的SQL明細(xì)中可以根據(jù)TRACE_ID找到該SQL HOST: 發(fā)送該SQL的客戶端的IPSTART_TIME: 2016-03-25 20:32:55.312 DRDS收到這個(gè)SQL的時(shí)間EXECUTE_TIME1003DRDS執(zhí)行該SQL消耗的時(shí)間AFFECT_ROW: 1該SQL返回的記錄數(shù)或者影響的行數(shù)SQL: select sleep(1)執(zhí)行的語(yǔ)句該SQL的唯一標(biāo)記,同一個(gè)邏輯SQL以及該邏輯SQL產(chǎn)生的物理SQL的TRACE_ID相TRACE_ID:905e1a093800000會(huì)以注釋的形式發(fā)送到RDS,在RDS的SQL明細(xì)中可以根據(jù)
36、TRACE_ID找到該SQL 會(huì)以注釋的形式發(fā)送到RDS,在RDS的SQL明細(xì)中可以根據(jù)TRACE_ID找到該SQL GROUP_NAME:TDDL5_00_GROUP執(zhí)行的分片名稱DBKEY_NAME:db218249098_sqa_zmf_tddl5_00_3309 執(zhí)行的分庫(kù)信息START_TIME:2016-03-2520:32:54.31始執(zhí)行這個(gè)SQL的時(shí)間EXECUTE_TIME1003DRDS執(zhí)行該SQL消耗的時(shí)間SQL_EXECUTE_TIME1002DRDS調(diào)用RDS執(zhí)行該SQL消耗的時(shí)間GETLOCK_CONNECTION_TIME0DRDS從連接池取連接消耗的時(shí)間CRE
37、ATE_CONNECTION_TIME0DRDS建立RDS連接消耗的時(shí)間AFFECT_ROW:1該SQL返回的記錄數(shù)或者影響的行數(shù)SQL:selectsleep(1)執(zhí)行的語(yǔ)句該SQL的唯一標(biāo)記,同一個(gè)邏輯SQL以及該邏輯SQL產(chǎn)生的物理SQL的TRACE_ID:905e1a093800000例子mysql show full slow where sql like %sleep% order by execute_time limit 1;+|TRACE_ID|HOST|mysql show full slow where sql like %sleep% order by execute_
38、time limit 1;+|TRACE_ID|HOST|START_TIME| EXECUTE_TIME | AFFECT_ROW|SQL|+|905e1a093800000|2016-03-2520:32:55.312|1003|1 | select sleep(1)|+1 row in set (0.06 sec)mysql show full physical_slow where trace_id=905e1a093800000;+|TRACE_ID|GROUP_NAME|DBKEY_NAME|START_TIME| EXECUTE_TIME | SQL_EXECUTE_TIME|G
39、ETLOCK_CONNECTION_TIME|CREATE_CONNECTION_TIME|AFFECT_ROW|SQL|+| 905e1a093800000 | TDDL5_00_GROUP | db218249098_sqa_zmf_tddl5_00_3309 | 2016-03-25 20:32:54.31 |1003|1002|0|0|1 | select sleep(1)|+1 row in set (0.03 sec)DRDS 數(shù)據(jù)導(dǎo)入文檔使用DRDS的一個(gè)常見(jiàn)問(wèn)題是,如何將歷史數(shù)據(jù)導(dǎo)入到DRDS中,本文檔將指導(dǎo)您快速完成數(shù)據(jù)導(dǎo)入工作。 首先,根據(jù)數(shù)據(jù)來(lái)源的不同可以分為兩種場(chǎng)景:場(chǎng)
40、景1:數(shù)據(jù)來(lái)自您自建的數(shù)據(jù)庫(kù)場(chǎng)景2:數(shù)據(jù)來(lái)自RDS針對(duì)兩種場(chǎng)景,有三種具體解決方案:對(duì)于場(chǎng)景1,按照數(shù)據(jù)量不同,有兩種最佳實(shí)踐:數(shù)據(jù)總量少于500萬(wàn)條:推薦使用Navicat、sqldump等工具,參考下文中 1.1 小數(shù)據(jù)量導(dǎo)入 小節(jié)。數(shù)據(jù)總量超過(guò)500萬(wàn)條:推薦先將數(shù)據(jù)導(dǎo)入到RDS,再?gòu)腞DS中導(dǎo)入到DRDS,參考下文中 1.2 大數(shù)據(jù)導(dǎo)入 小節(jié)。對(duì)于場(chǎng)景2,可以使用DRDS的數(shù)據(jù)導(dǎo)入功能完成導(dǎo)入,使用方法見(jiàn)下文 2.數(shù)據(jù)來(lái)自RDS 小節(jié)。從自建數(shù)據(jù)庫(kù)導(dǎo)入小數(shù)據(jù)量導(dǎo)入通常采用單線程導(dǎo)入,其劣勢(shì)是導(dǎo)入的速度會(huì)比較慢,無(wú)法發(fā)揮分布式數(shù)據(jù)庫(kù)非常高的系統(tǒng)并行度優(yōu)勢(shì),但實(shí) 際使用相當(dāng)方便。推薦的方式
41、有兩種:使用sqldump導(dǎo)出數(shù)據(jù)后,用mysql source命令導(dǎo)入到DRDS,參考官方手冊(cè) / 中文教程。使用Navicat可以從CSV、TXT、XML、DBF 以及更多格式的文件中導(dǎo)入數(shù)據(jù),參考 官方手冊(cè) 高級(jí)工具-導(dǎo)入向?qū)Р糠?。大?shù)據(jù)導(dǎo)入對(duì)于數(shù)據(jù)量比較大的場(chǎng)景,導(dǎo)入需要分兩步完成。首先將數(shù)據(jù)導(dǎo)入到RDS,參考數(shù)據(jù)遷入RDS再使用DRDS的數(shù)據(jù)導(dǎo)入功能完成 RDS-DRDS 的數(shù)據(jù)遷移,使用方法見(jiàn) 2.從RDS導(dǎo)入 小節(jié)。從RDS導(dǎo)入DRDS 數(shù)據(jù)導(dǎo)入功能用于完成 RDS-DRDS 的數(shù)據(jù)遷移。數(shù)據(jù)導(dǎo)入流程分為 建表-配置-遷移-切換 四個(gè)步驟建表在導(dǎo)入數(shù)據(jù)之前,首先需要在DRDS上創(chuàng)
42、建相同結(jié)構(gòu)的表,建表可以使用控制臺(tái)上的DDL功能完成。 或是通過(guò)命令行執(zhí)行,語(yǔ)法參考DRDSDDL語(yǔ)句,配置數(shù)據(jù)導(dǎo)入任務(wù)的配置入口在DRDS控制臺(tái)DB詳情頁(yè)面的最上方,如下圖所示:點(diǎn)擊 數(shù)據(jù)導(dǎo)入 按鈕進(jìn)入配置頁(yè)面,首先需要填寫(xiě)源信息和目標(biāo)信息:源信息:RDS上數(shù)據(jù)庫(kù)的信息,包括RDS實(shí)例ID、數(shù)據(jù)庫(kù)名、編碼、賬號(hào)和密碼。目標(biāo)信息:DRDS信息,包括創(chuàng)建DRDS數(shù)據(jù)庫(kù)時(shí)填寫(xiě)的賬號(hào)、密碼。點(diǎn)擊 下一步 后,進(jìn)入表選擇頁(yè)面,控制臺(tái)會(huì)預(yù)先檢查哪些表是允許遷移的,在該頁(yè)面中會(huì)顯示檢查結(jié)果:勾選需要遷移的數(shù)據(jù)表,并點(diǎn)擊 開(kāi)始導(dǎo)入 提交數(shù)據(jù)導(dǎo)入任務(wù)。遷移數(shù)據(jù)導(dǎo)入任務(wù)提交后,可以在控制臺(tái)右上角的任務(wù)列表中看到
43、導(dǎo)入任務(wù)的進(jìn)度:切換任務(wù)執(zhí)行完成后會(huì)顯示 切換 和 取消 按鈕關(guān)于任務(wù)完成: 導(dǎo)入的數(shù)據(jù)包含全量(所有歷史數(shù)據(jù))和增量(全量遷移期間產(chǎn)生的數(shù)據(jù))兩部分,執(zhí)行順序是導(dǎo)入全量再導(dǎo)入增量。 導(dǎo)入任務(wù)顯示 成功 時(shí),代表目前DRDS中數(shù)據(jù)已經(jīng)和 RDS 實(shí)例中數(shù)據(jù)同步,此時(shí)后臺(tái)數(shù)據(jù)遷移進(jìn)程還在運(yùn)行,以保證維持同步狀態(tài)。 當(dāng)點(diǎn)擊 切換 才會(huì)停止增量數(shù)據(jù)的遷移。切換后,數(shù)據(jù)導(dǎo)入完成。點(diǎn)擊 切換 按鈕后,數(shù)據(jù)導(dǎo)入完成。注意事項(xiàng)導(dǎo)入前需要先在DRDS上創(chuàng)建好需要寫(xiě)入數(shù)據(jù)的表。大數(shù)據(jù)量時(shí)保證源RDS有充足的空間(數(shù)據(jù)+binlog),避免出現(xiàn)因?yàn)榭臻g不足導(dǎo)致binlog被刪除,進(jìn)而導(dǎo)致增量遷移失敗問(wèn)題。若源RD
44、S同時(shí)掛載在DRDS下,大數(shù)據(jù)量時(shí)保證 RDS 有充足的空間(2份數(shù)據(jù)+binlog),避免出現(xiàn)導(dǎo)入問(wèn)題。全局唯一數(shù)字序列DRDS全局唯一數(shù)字序列(64位數(shù)字,對(duì)應(yīng)MySQL中BIGINT類型,以下簡(jiǎn)稱為sequence)的主要目標(biāo)是為了 保證所定義唯一字段中的數(shù)據(jù)的全局唯一(比如PRIMARY KEY,UNIQUE KEY等)和有序遞增,但不保證連續(xù)性,用戶不能依賴sequence的連續(xù)性進(jìn)行任何業(yè)務(wù)操作。DRDS中的sequence主要有兩類用法:隱式sequence,在為主鍵定義AUTO_INCREMENT后,用于自動(dòng)填充主鍵,由DRDS自動(dòng)維護(hù); 顯式sequence,通過(guò)DRDS的D
45、DL語(yǔ)法創(chuàng)建和維護(hù),可以獨(dú)立使用。主鍵自動(dòng)填充DRDS能夠支持INSERT時(shí)自動(dòng)填充主鍵(BIGINT類型,設(shè)定為PRIMARY KEY、AUTO_INCREMENT)。這樣就意味著,在INSERT語(yǔ)句中若沒(méi)有指定主鍵,DRDS會(huì)自動(dòng)地將主鍵填充進(jìn)來(lái),請(qǐng)參考以下示例:mysqlmysqlinsertintousers(name,address,gmt_created,gmt_modified,intro)values(sun,hz,now(),now(),aa); Query OK, 1 row affected (0.02sec)mysql select last_insert_id();+
46、| LAST_INSERT_ID() |+| 5018 |+1 row in set (0.00 sec)您也可以使用標(biāo)準(zhǔn)的JDBC接口來(lái)獲取LastInsertId,與普通的MySQL一致。注意:當(dāng)創(chuàng)建DRDS庫(kù)為非拆分模式,DRDS自動(dòng)填充主鍵機(jī)制失效,由MySQL生成。創(chuàng)建、查詢、更新和刪除sequence在以下sequence語(yǔ)法中:大寫(xiě)單詞為關(guān)鍵字;小寫(xiě)斜體單詞為需要用戶指定的名稱或數(shù)值;中括號(hào)內(nèi)包含的為可選項(xiàng);尖括號(hào)內(nèi)包含的為必填項(xiàng);豎線分隔的關(guān)鍵詞為或的關(guān)系,即多選一。請(qǐng)注意,上述大小寫(xiě)的區(qū)分僅為語(yǔ)法說(shuō)明的目的,在語(yǔ)句的實(shí)際使用中并不區(qū)分大小寫(xiě)。創(chuàng)建sequence創(chuàng)建seque
47、nce語(yǔ)句如下:CREATE SEQUENCE START WITH INCREMENT BY MAXVALUE CYCLE | NOCYCLE START WITH:代表sequence的起始值,若未指定,則默認(rèn)值為1;INCREMENT BY:代表sequence每次增長(zhǎng)時(shí)的增量值(或稱為間隔值或步長(zhǎng)),若未指定,則默認(rèn)值為1;MAXVALUE:代表sequence允許的最大值,若未指定,則默認(rèn)值為有符號(hào)長(zhǎng)整形(Signed BIGINT)的最大正值;CYCLE或NOCYCLE:兩者只能選擇其一,代表當(dāng)sequence值增長(zhǎng)到最大值后,是否允許繼續(xù)循環(huán)(即仍從START WITH開(kāi)始)使用
48、sequence值,若未指定,則默認(rèn)值為NOCYCLE。示例:mysql create sequence sample_seq start with 10 increment by 2 maxvalue 10000000 nocycle;指定所有參數(shù):mysql create sequence sample_seq start with 10 increment by 2 maxvalue 10000000 nocycle;Query OK, 1 row affected (0.01 sec)Query OK, 1 row affected (0.01 sec)mysql create seq
49、uence sample_seq_part start with 100; Query OK, 1 row affected (0.01 sec)指定部分參數(shù),其余使用默認(rèn)值:mysql create sequence sample_seq_part start with 100; Query OK, 1 row affected (0.01 sec)mysql create sequence sample_seq_default; Query OK, 1 row affected (0.01 sec)不指定參數(shù),全部使用默認(rèn)值:mysql create sequence sample_seq
50、_default; Query OK, 1 row affected (0.01 sec)查詢sequence查詢sequence語(yǔ)句如下: SHOW SEQUENCESmysql show sequences;+mysql show sequences;+| ID | NAME | VALUE | GMT_MODIFIED |+| 1 | AUTO_SEQ_USERS | 5000 | 2014-08-09 18:20:28 | 2 | AUTO_SEQ_ITEMS | 5000 | 2014-06-18 16:08:06 | 3 | AUTO_SEQ_ORDERS | 6000 | 201
51、4-06-18 16:08:06 | 4 | sample_seq | 12000 | 2014-08-09 18:21:28 | 5 | AUTO_SEQ_DEF | 2000 | 2014-07-04 17:55:36 | 6 | WEBO_COMMENTS | 0 | 2014-07-13 19:38:55 | 7 | AUTO_SEQ_ABC | 66000 | 2014-07-16 15:10:43 | 8 | AUTO_SEQ_CATEGORY | 2000 | 2014-07-17 15:53:27 | 9 | AUTO_SEQ_USER | 2000 | 2014-07-25
52、16:54:29 | 10 | AUTO_SEQ_CLUSTER | 2000 | 2014-07-27 15:58:34 | 11 | AUTO_SEQ_SPE_CLUSTER | 2000 | 2014-07-28 16:21:30 | 12 | AUTO_SEQ_A | 2000 | 2014-07-28 16:22:08 |+17 rows in set (0.04 sec)更新sequence更新sequence語(yǔ)句如下:ALTER SEQUENCE START WITH INCREMENT BY MAXVALUE CYCLE | NOCYCLE START WITH:代表seque
53、nce的起始值,是必選項(xiàng),該參數(shù)會(huì)更新當(dāng)前維護(hù)的sequence值;若想保留更新sequence之前的原sequence值,請(qǐng)先查詢?cè)挡⒂迷搮?shù)指定;INCREMENT BY:代表sequence每次增長(zhǎng)時(shí)的增量值(或稱為間隔值或步長(zhǎng)),若未指定,則沿用原值; MAXVALUE:代表sequence允許的最大值,若未指定,則沿用原值;CYCLE或NOCYCLE:兩者只能選擇其一,代表當(dāng)sequence值增長(zhǎng)到最大值后,是否允許繼續(xù)循環(huán)(即仍從START WITH開(kāi)始)使用sequence值,若未指定,則沿用原值。示例:mysqlmysqlaltersequencesample_seqstar
54、twith1000incrementby1maxvalue10000000cycle; Query OK, 1 row affected (0.01sec)mysql alter sequence sample_seq start with 100; Query OK, 1 row affected (0.01 sec)指定部分參數(shù),其余沿用原值:mysql alter sequence sample_seq start with 100; Query OK, 1 row affected (0.01 sec)刪除sequence刪除sequence語(yǔ)句如下:mysql drop sequen
55、ce sample_seq;DROP SEQUENCE 示例:mysql drop sequence sample_seq;常用操作及常見(jiàn)問(wèn)題處理獲取顯式sequence值可以通過(guò)DRDS指定SQL獲取最新sequence值, 語(yǔ)法是:select sample_seq.nextVal from dual;+| SAMPLE_SEQ.NEXTVAL |+select sample_seq.nextVal from dual;+| SAMPLE_SEQ.NEXTVAL |+| 101001 |+1 row in set (0.04 sec)| 101001 |+1 row in set (0.0
56、4 sec)mysqlmysqlinsertintosome_users(name,address,gmt_create,gmt_modified,intro)values (sun,SAMPLE_SEQ.nextVal,now(),now(),aa);Query OK, 1 row affected (0.01 sec)如何處理主鍵沖突當(dāng)您直接在RDS中寫(xiě)入了數(shù)據(jù),而對(duì)應(yīng)的主鍵值不是DRDS生成的sequence值,那么后續(xù)讓DRDS自動(dòng)生成主 鍵寫(xiě)入數(shù)據(jù)庫(kù),可能會(huì)和這些數(shù)據(jù)發(fā)生主鍵沖突,一般我們可以通過(guò)以下幾步解決問(wèn)題:1、通過(guò)DRDS指定SQL來(lái)查看當(dāng)前已有sequence(AUTO_S
57、EQ_是DRDS自動(dòng)加上的sequence名字的前綴mysql show sequences;+mysql show sequences;+| ID | NAME | VALUE | GMT_MODIFIED |+| 1 | AUTO_SEQ_USERS | 5000 | 2014-08-09 18:20:28 | 2 | AUTO_SEQ_ITEMS | 5000 | 2014-06-18 16:08:06 | 3 | AUTO_SEQ_ORDERS | 6000 | 2014-06-18 16:08:06 |+3 rows in set (0.04 sec)2、比如USERS表有沖突,并且
58、USERS表主鍵是ID,那么從DRDS獲取這個(gè)表最大主鍵值:mysql select max(id) from USERS;mysql select max(id) from USERS;+| MAX(ID) |+| 8231 |+1 rows in set (0.04 sec)mysql alter sequence AUTO_SEQ_USERS start with 9000; Query OK, 1 row affected (0.01 sec)3、更新DRDS sequence表中對(duì)應(yīng)的值,我們更新成比8231要大的值,比如9000,更新完成后,后續(xù)insert DRDS生成自增主鍵將
59、不再報(bào)錯(cuò):mysql alter sequence AUTO_SEQ_USERS start with 9000; Query OK, 1 row affected (0.01 sec)全表掃描DRDS 在全表掃描時(shí)支持聚合函數(shù)進(jìn)行統(tǒng)計(jì)匯總,目前全表掃描默認(rèn)是關(guān)閉的,需要您顯示的通過(guò)配置打開(kāi),因?yàn)槲覀冋J(rèn)為默認(rèn)關(guān)閉對(duì)于您而言,性能更可控。 具體的配置方式,您可以訪問(wèn)我們提供的運(yùn)維管理平臺(tái),找到對(duì)應(yīng)的表后進(jìn)行配置:如果目標(biāo)表沒(méi)有分庫(kù)分表,那么 DRDS 可以支持任何聚合函數(shù),因?yàn)閷?shí)際上 DRDS 是直接把原 SQL傳遞到MySQL非全表掃描:SQLDRDSMySQLWHERE 條件中都是 = 關(guān)系
60、,常會(huì)出現(xiàn)這種情況。在非全表掃描的情形下,同樣可以支持任何聚合函數(shù)。COUNTMAXMINSUMLIKEORDERBY 與 LIMIT 語(yǔ)法, 但是不支持 GROUP BY 語(yǔ)法。并行的全表掃描:在一些時(shí)候您可能希望直接從所有庫(kù)上面dump數(shù)據(jù)到其他地方,我們也提供了方法可以 允許您感知到當(dāng)前下層有多少個(gè)庫(kù),并允許您單獨(dú)的針對(duì)這些庫(kù)進(jìn)行操作。mysql: show topology from tddl_users;+| ID mysql: show topology from tddl_users;+| ID |GROUP_NAME| TABLE_NAME|+| 0|DRDS_00_RDS|d
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 黑龍江2025年02月黑龍江省伊春市事業(yè)單位上半年公開(kāi)招考335名工作人員筆試歷年典型考題(歷年真題考點(diǎn))解題思路附帶答案詳解
- 甘肅2024年12月甘肅省慶陽(yáng)市西峰區(qū)事業(yè)單位2025年引進(jìn)136名高層次和急需緊缺人才筆試歷年典型考題(歷年真題考點(diǎn))解題思路附帶答案詳解
- 跨領(lǐng)域?qū)W習(xí)與自我突破之道
- 金融行業(yè)與職業(yè)教育培訓(xùn)的深度融合研究
- 跨文化背景下的營(yíng)銷培訓(xùn)策略
- 跨文化背景下的行業(yè)報(bào)告撰寫(xiě)要點(diǎn)
- 跨境電商平臺(tái)用戶體驗(yàn)與界面設(shè)計(jì)
- 跨境服務(wù)平臺(tái)的發(fā)展機(jī)遇和挑戰(zhàn)分析
- 足浴店服務(wù)人員情緒管理對(duì)顧客體驗(yàn)的影響
- 恒定流能量方程式二熱工流體課件
- 材料供應(yīng)履約信用證明:免修版模板范本
- 2023南方國(guó)家電網(wǎng)招聘筆試參考題庫(kù)(共500題)答案詳解版
- 門式起重機(jī)、架橋機(jī)作業(yè)前安全隱患排查表
- 不合格品處置記錄表(標(biāo)準(zhǔn)版)
- 德語(yǔ)現(xiàn)代主義文學(xué)-浙江大學(xué)中國(guó)大學(xué)mooc課后章節(jié)答案期末考試題庫(kù)2023年
- 機(jī)床數(shù)控技術(shù)PPT完整全套教學(xué)課件
- 店面租賃合同店面租賃合同店面租賃合同書(shū)
- lm3s8962開(kāi)發(fā)板用戶手冊(cè)
- 《小學(xué)教師職業(yè)道德》課程標(biāo)準(zhǔn)
- IATF16949-過(guò)程審核檢查表-(含審核記錄)-
- 食品防護(hù)評(píng)估表
評(píng)論
0/150
提交評(píng)論