<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
攜程酒店訂單系統的儲存設計從1999年收錄第一單以來,已經完成了從單一SQLServer資料庫到多IDC容災、完成分庫分表等多個階段,在見證了大量業務奇蹟的同時,也開始逐漸暴露出老驥伏櫪的心有餘而力不足之態。基於更高穩定性與高效成本控制而設計的訂單儲存系統,已經是攜程在疫情後恢復業務的必然訴求。
目前攜程酒店訂單系統,在著在業務高增長的同時,也面臨著資訊讀寫管理能力受制於資料庫自身效能與穩定性的窘境。綜合分析,一則為攜程服役了十多年的SQLServer伺服器叢集的磁碟容量設計,已經跟不上時下新增訂單量的空間訴求;二則在系統能力提升上造成了各大業務系統巨大的底層瓶頸與風險,同時又相比業界主流已基於MySQL架構設計儲存系統而言,我們的訂單儲存系統仍基於SQLServer構建也整體推高了運營成本。
為了支撐未來每日千萬級訂單的業務增長目標,同時滿足高可用、高效能、高可延伸的高效成本控制期望,我們為酒店部門的訂單DB所有存取開發並落地了一套穩定且可靠的統一中介軟體封裝方案,對現狀收斂並提供了全域性統一的熱點快取系統,徹底解決了當下訂單上層應用與資料庫間直連的方案缺陷。
新系統由中介軟體服務統一實現了對上層應用提供資料鏈服務,並達成了為現有依賴訂單庫的應用以及其他直接或間接的資料應用無感的實現儲存底層由SQLServer向MySQL技術架構遷移的目標。
通過對現有系統瓶頸的分析,我們發現核心缺陷集中在訂單資料快取分散導致資料各端不一致,各訂單應用則與資料庫直連又造成可延伸性差。通過實踐我們編寫中介軟體抽象並統一了資料存取層,以及基於資料庫部署架構映象構建了訂單快取統一管理熱點資料,解決了各端差異。
圖1.1 儲存系統架構圖
從訂單的提交到各端可見的速度為儲存服務的核心指標之一,我們對資料鏈的主要環節進行了優化,覆蓋了新單同步、訊息實時推播、查詢索引構建以及資料平臺離線歸檔等主要環節,使大系統內資料到達速度在3秒以內,即使用者剛下完單即可跳轉我攜列表可見。
當新使用者創單時,同步服務作為資料鏈入口將使用者訂單資料通過中介軟體寫入訂單庫,此時中介軟體同時完成訂單快取的構建;
當訂單完成入庫行為和熱點資料構建後拋訂單訊息,實時輸出給各子系統;
當新單入庫完畢即刻構建訂單明細資訊的ES索引,為第三方提供檢索支援;
最後資料平臺T+1實施當日資料的歸檔供BI等各類離線業務使用。
圖2.1 資料鏈
對客、商、員工工作臺三端的支援是訂單儲存系統的基本角色,圖2.1資料鏈在新單提交後為自動發單與工作臺起到的銜接作用功不可沒。自動發單即在客人提交訂單後,以最快的響應速度向商戶傳送訂單明細資訊進行核實貨位、確認訂單等流程。工作臺則協助員工介入流程及時獲取訂單處理人工事件。
圖2.2 基於儲存系統的發單與工作臺關係(縮略細節)
基於訂單資料為核心的主要分為線上查詢和資料分析兩條業務線,以對詳情查詢為例,存取QPS終年保持在高位,每逢假期高峰則容易造成查詢瓶頸,根因覆盤後在本次架構升級中我們做了調整來優化相關場景的高可用性。
如此以上,我們將訂單主庫的存取保護在訂單快取、實時訊息、Hive數倉三駕馬車之後,與業務盡最大可能的解耦。
在對攜程核心儲存系統進行更新換代的過程中,貫穿全程需要做到的是熱遷移,並達成所有操作對資料鏈路上的各應用透明無失真的目標。我們的設計通盤分析了集團資料鏈路的特性,由訂單快取系統提供資料庫映象降低應用與資料庫的直連耦合,繼而再通過中介軟體對應用透明掉資料來源於SQLServer / MySQL的物理關係,提供底層熱遷移的操作空間。
結合無失真遷移的工藝設計,注重對每一筆資料庫流量的可見及可控,支援全庫、Shard級、表級、CRUD操作級的流量分配策略,提供了底層資料遷移足夠的實施手段。數倉銜接設計則側重於解決資料平臺百億級離線資料與雙庫線上期間的同步問題,以及解決全量接入MySQL期間產生的資料問題。
以下將分三個部分分享我們在這一過程中學到的經驗。
隨著業務發展,使用者數和存取量越來越大,訂單系統應用和伺服器的壓力也與日俱增。在沒有引入訂單快取之前,每個應用獨立連線資料庫,造成查詢出來的資料無法在應用間共用,並且DB每秒查詢量和連線數都有上限,而酒店核心交易鏈路基於DB儲存,存在單點故障風險。
經過埋點資料分析,訂單系統是典型的讀多寫少,為了共用熱點查詢資料以及降低DB負載,一個有效的辦法就是引入快取,如圖3.1,使用者的請求過來時,優先查詢快取,如果存在快取資料,則直接返回結果;快取沒有命中,則去查詢DB,根據設定策略校驗DB結果資料,校驗通過則將DB資料寫入快取留作後續查詢使用,否則不寫入快取,最後返回DB查詢結果。
圖3.1 訂單快取基本設計
關於引入新的快取元件後的硬體開銷,可通過收斂原來各應用分散的硬體資源來降低總成本,但還會因為中心化管理帶來可用性挑戰以及資料一致性等問題,故需要充分對現有系統進行容量評估、流量估算和快取表價值分析。只快取存取量高的熱點資料表,通過恰當的快取結構設計、資料壓縮和快取淘汰策略,最大程度提高快取命中率,在快取容量、硬體成本和可用性之間做好權衡。
傳統的快取設計,是一條資料庫表記錄對應一條快取資料。而在訂單系統中,一個訂單查詢多表的場景很常見,如果採用傳統設計,在一次使用者查詢中,Redis的存取次數是隨著表數量增加的,這種設計網路IO較大並且耗時較長。在盤點表維度流量資料時,我們發現有些表經常一起查詢,不到30%的表其查詢流量超過90%,在業務上完全可以劃分為同一個抽象領域模型,然後基於hash結構進行儲存,如圖3.2,以訂單號作為key,領域名稱作為field,領域資料作為value。
這樣無論是單表還是多表查詢,每個訂單都只需要存取一次Redis,即減少了key,又減少了多表查詢次數,提升了效能。同時value基於protostuff進行壓縮,還減少了Redis的儲存空間,以及隨之而來的網路流量開銷。
圖3.2 基於domain的儲存結構簡述
如何做到無失真熱遷移是整個專案最具挑戰性的地方。在工藝設計之前我們的前置工作首先完成了中介軟體的開發,通過中介軟體將資料庫與業務層應用一分為二。其次抽象Dao層實現領域化,並由資料領域層嚮應用提供資料服務,領域之下適配SQLServer和MySQL兩種資料庫並統一封裝。以此為基礎才能為以下述工藝設計實施無失真熱遷移。
圖3.3 操作工藝簡介
為了方便理解生產資料到資料倉儲ODS層資料的遷移,做到對下游透明,這裡簡單介紹一下常規資料倉儲的分層體系。通常資料倉儲主要分為五層:ODS(原始資料層)、DIM(維度)、EDW(企業數倉)、CDM(通用模型層)、ADM(應用模型層),
如下圖所示:
圖3.4 資料倉儲分層結構
從圖3.4上可以看出,資料倉儲各層都依賴ODS層的資料,為了不影響資料平臺所有應用,我們只需要將原來訂單庫ODS層資料來源從SQLServer遷移到MySQL庫即可。
從圖上很直觀的看出,遷移只需換個資料來源不是很麻煩,但是為了保證資料質量,我們做了很多的前置工作,比如:DBA預先將生產資料同步到生產MySQL庫、MySQL資料實時同步、生產兩側資料一致性校驗、MySQL側資料同步到ODS層、ODS層資料一致性校驗及原有ODS層同步Job資料來源切換等。
其中,生產兩側資料一致性校驗和資料倉儲ODS層資料一致性校驗最為複雜,耗時也最長,要確保每張表、每個欄位都要一致時才能切換資料來源。但是,從實際操作過程中,卻做不到完全一致。根據實際情況,適當處理時間型別、浮點值精度及小數位等。
下面介紹一下整體流程:
首先,對於線上資料一致校驗,我們開發了線上同步Job,將SQLServer的資料和MySQL資料進行比較,發現不一致時,就將MySQL的資料以SQLServer資料為基準更新掉,確保兩邊資料的一致性。
其次,對於離線資料一致性校驗,我們和資料倉儲同事合作把MySQL側資料同步到ODS層(以庫名區分是SQLServer還是MySQL的表),並且將定時跑的任務和SQLServer側任務在時間上儘量一致。兩側資料都準備好後,我們開發了離線資料校驗指令碼生成器,根據資料倉儲後設資料,為每張表生成一個同步Job,將其部署到排程平臺。
同步任務會依賴兩側ODS層同步資料,T+1資料同步完成後,執行一致性校驗,將不一致的訂單號記錄到不一致明細表中,並統計不一致的資料量,將結果儲存到統計表中。然後在自助報表平臺製作一個報表,將每天統計的不一致的表及不一致量傳送到郵箱,我們每天對不一致的表進行排查詢出問題,調整比較策略,更新比較Job。大致流程如下:
圖3.5 一致性校驗整體流程
最後,隨著線上和離線資料逐步趨於一致後,我們將原先SQLServer同步到ODS層Job的資料來源切換到MySQL。這裡可能有同學會有疑問:為什麼不直接使用MySQL側ODS層的表呢?原因是,經過統計,依賴原先ODS層表的Job有上千個之多,如果讓依賴Job切換到MySQL側ODS表,修改工作量非常大,所以我們直接將原來的ODS層同步資料來源直接切換成MySQL。
實際操作中,切資料來源並不能一次全部切完,我們分三批進行,先找十幾個不那麼重要的表作為第一批,切完後執行兩週,並收集下游資料問題的反饋。第一批表順利切完兩週後,我們沒收到下游報資料問題,說明資料質量沒問題。然後再將剩餘的幾百張表按重要程度分兩批繼續切,直到切完。
至此,我們完成了訂單庫從SQLServer遷移到MySQL在資料倉儲層的遷移工作。
實際上再周密的分析與設計,總是難免遇到執行過程中的各種挑戰。我們總結了一些經典問題,雖然通過技術手段最終解決了這些大大小小問題並達成了目標,但是相信各位看官必定還有更好的解決方案,我們樂見共同學習與進步。
訂單系統涉及到的應用和表數量眾多,一個應用對應1到n張表,一張表又對應1到n個應用,是典型的多對多關係。如圖4.1,對於上層應用來說,從一個SQLServer資料庫,切換到另一個MySQL資料庫,其基本流程參照操作工藝章節至少分為以下幾步:
圖4.1 應用和資料庫以及表的關係圖
在生產環境更換資料庫系統,就像在高速公路上不停車換輪胎,需要維持原有的車速不變,且對使用者無感,否則後果不敢設想。
在切換工藝中雙寫、單讀和單寫流程,環環相扣,步步相依,作為配套設計監控手段必須確認上一個操作達到預期效果才能進行下一個。如果跳過或者沒有切換乾淨就貿然進行下一步,比如還沒有雙寫完全一致,就開始讀MySQL資料,可能造成查無此資料或者查到髒資料!那麼就需要對每一個CRUD操作的讀寫進行監控,在遷移過程中做到360度無死角視覺化流量細分控制,所見即所得。具體的做法如下:
綜上所述,基本方案為通過中介軟體為管道為所有接入的應用統一埋點,通過實時展示應用層的行為觀察流量分佈,並結合公司資料庫側Trace的視覺化工具核實應用的流量切換行為與資料庫實際QPS及負載浮動保持一致來監督遷移任務。
酒店的訂單庫有著二十年左右歷史,經年累積,跨部門和酒店內部多個團隊直接或間接依賴訂單庫SQLServer,要想切換到MySQL,就得先解決雙寫DB一致性問題,不一致主要體現在以下兩點:
關於雙寫資料一致性的保證,我們基於同步Job將SQLServer資料為準線,根據最後更新時間,拉取兩側DB資料進行比對,如果不一致則修復MySQL的資料並將不一致資訊寫入ES,供後續排查根因。
但也因為引入了額外的Job操作MySQL資料,帶來了新的問題,那就是多表雙寫時,因為耗時翻倍,Job發現SQLServer有資料而MySQL沒有,就立即修復了MySQL資料,造成雙寫失敗。所以雙寫部分失敗又加上了Failover機制,通過拋送訊息,觸發新一輪的比對和修復工作,直到兩側DB資料完全一致。
同步Job和Failover訊息機制雖然可以讓資料最終一致,但畢竟有秒級的間隔,兩側資料是不一致的,並且對於眾多應用的各種場景,難免會有遺漏時單寫SQLServer。對於這些漏寫MySQL的地方,通過DBTrace是無法找到的,因為無法確定一個CUD操作只寫入SQLServer,而未寫入MySQL。那麼有沒有辦法事前就能找出漏寫MySQL的場景呢,確實被我們找出來一點,那就是更換資料庫連線串,接入中介軟體的應用使用新連線串,然後找出所有使用舊連線串操作SQLServer的SQL,就能準確定位出漏寫MySQL的流量了。
最終,我們將雙寫DB不一致率從十萬分之二逐步降低到了幾乎為0,為什麼是幾乎呢,因為DB的一些特性差異問題,會天然的導致資料無法完全一致,這個在後續內容會有詳細的論述。
引入快取之後,就涉及到對快取進行寫入或者更新,業界常見的做法分為以下幾種:
在具體實施上還會進行雙刪快取或者延遲雙刪快取,此處不再比較各種做法的優劣。我們採用的是先寫DB再刪快取方案,對於資料敏感表,會進行延遲雙刪,後臺的同步Job定時比對、修復和記錄資料庫資料與Redis資料的差異,雖然設計上已經能保證最終一致性,但是在前期還是出現過大量的資料不一致。主要體現在以下幾個方面:
而為了解決快取一致性問題,如圖4.2,我們在原有的快取和DB基礎上,增加了樂觀鎖和CUD施工標記,來限制並行情況下同時存在載入資料到快取相互覆蓋的行為,以及對當前被查資料正在進行CUD操作的感知。在此兩種場景未結束期間可以做到Query流量直連DB,通過基於樂觀鎖的最後寫入者獲勝機制解決競爭問題。最終我們的快取不一致率從百萬分之二控制到了千萬分之三。
圖4.2 快取一致性解決
圖4.2當查詢未命中快取,或當前存在該資料的樂觀鎖或施工標記時,當次查詢直連DB,直至相關事務完成後放開快取資料自動載入功能。
專案啟動初期我們對MySQL進行了最近N年資料的一次性鋪底,這就產生了在雙寫階段無法校準的如下兩個場景的資料:
針對第一點,我們開發了MySQL資料專項清理Job,由於訂單資料庫是多Shard的,Job內部根據實際Shard數設定核心執行緒總量,每個執行緒分別負責對應Shard中的指定表進行清理,並行開多臺伺服器分發任務進行清理,通過速度控制既保證了效率又不影響生產上資料庫的負載。
針對第二點,在所有應用接中介軟體和所有表實現雙寫後,通過調整線上同步Job掃描的開始時間戳,對存量訂單資料進行修復。修復時特別注意的是,掃描資料要按時間段分片處理,防止載入資料太多導致訂單庫伺服器CPU太高。
在如此龐大的系統下進行資料庫熱遷移,我們就必須瞭解不同資料庫之間的差異與不同,做到知己知彼,對症下藥。MySQL與SQLServer雖同為時下流行的關係型資料庫,均支援標準化SQL查詢,但在細枝末節上還是有些許差異。下面我們通過遷移中所面臨的問題來具體分析一下。
1)自增鍵問題
為保證資料自增序號一致,不能讓兩個資料庫各自去進行自增,否則一旦不一致就要面臨修資料甚至更大風險。因此,在資料雙寫時,我們將SQLServer寫入後生成的自增id,回寫入MySQL自增列,在資料單寫MySQL時直接使用MySQL生成自增id值。
2)日期精度問題
雙寫後為了保證資料一致性,要對兩側資料進行一致性校驗,型別為Date、DateTime、Timestamp的欄位,由於儲存精度不一致,在對比時就需要做特殊處理,擷取到秒進行比較。
3)XML欄位問題
SQLServer中支援XML資料型別,而MySQL 5.7不支援XML型別。在使用varchar(4000)代替後,遇到MySQL資料寫入失敗,但同步Job將SQLServer資料回寫MySQL時又能正常寫入的案例。經過分析,程式在寫入時會將未壓縮的XML字串寫入,SQLServer XML型別會自動壓縮並儲存,但MySQL並不會,導致長度超過4000的寫入操作失敗,SQLServer壓縮後長度小於4000,又能夠正常回寫MySQL。為此我們提出應對措施,寫入前壓縮並校驗長度,非重要欄位擷取後再儲存,重要欄位優化儲存結構或更換欄位型別。
下面列舉一些遷移過程中常見的注意點。
我們的預警實踐並不侷限於專案推進期間的監控訴求,如何在百億級資料中週期掃描資料寫入的異常,完成專案期間雙寫資料一致率的複核,如何實時監控與預警訂單庫每個分片上訂單寫入量的正常趨勢,如何定期驗收/核驗整套系統的高可用性將在以下篇幅中描述。
要滿足訂單資料SQLServer遷移到MySQL庫,資料質量是遷移的必要條件,資料一致性達不到要求就無法透明遷移,所以設計合理的校驗方案,關乎遷移的進度。針對資料校驗,我們分為線上和線下兩種:
遷移期間我們通過同步Job,在計算出不一致資料後,將不一致的表及欄位寫入ElasticSearch,再用Kibana製作出不一致資料量及不一致表所佔比例的監控看板,通過監控看板,我們就可以實時監控哪些表資料不一致量比較高,再根據表名稱通過DBA工具排查出哪些應用對錶進行了CUD操作,進一步定位漏接中介軟體的應用和程式碼。
在實際操作中,我們確實找出了大量未接中間的應用並對其改造,隨著接入中介軟體的應用越來越多,資料一致性逐漸提高,從監控看板上看到不一致的量也慢慢降低。但是一致性始終沒有降低到零,原因是應用和同步Job並行導致的,這個也是最令人頭疼的問題。
或許有同學會疑問,既然雙寫了為什麼不停止掉同步Job呢?原因是雙寫以SQLServer為主寫,以受中介軟體覆蓋的CUD範圍為基準,除了不能保證寫入MySQL的資料百分百成功外也不能保證兩庫的資料量相等,所以需要一致性Job兜底。由於並行的存在,雖然做不到資料百分百一致,但是可以進一步降低。
我們的做法是,一致性Job比較時設定一個5秒的穩定線(即距離當前時間5秒內的資料視為不穩定資料),訂單資料時間戳在穩定線內的不進行比較,穩定線外的比較時,會再一次計算訂單資料是否在穩定線內,如果確認全部資料在穩定線外,就進行比較操作,否則放棄本次比較,由下一次排程執行一致性校驗。
訂單庫遷移涉及到幾百張表,離線資料比較多,一年的訂單相關資料就有上百億了,對於離線資料校驗比較有挑戰。我們編寫了資料一致性指令碼生成器,為每張表生成一個比較指令碼並部署到排程平臺,比較指令碼依賴上游SQLServer和MySQL兩側的同步Job,上游Job執行完畢後自動執行資料比較,將不一致資料的訂單號寫到明細表中,並根據明細表統計出不一致量,以日報的形式發出,每天對資料不一致比較高的表排查並解決。
通常一是能修復對比指令碼的瑕疵,二是發現離線資料問題,就這樣反覆摸排解決不一致問題。對於離線資料每張表每個欄位的校驗是非常複雜的,我們編寫UDF函數進行比較,UDF函數功能也很簡單,就是將每張表的非主鍵欄位進行拼接生成一個新欄位,兩側表進行全外連線,主鍵或者邏輯主鍵相等的記錄,生成新欄位也應該一樣,只要不一樣就視為不一致資料。這裡要注意日期欄位擷取、資料精度及末尾為零的小數處理問題。
經過三個多月的努力,我們排查出所有未接中介軟體的應用,並將其CUD操作全部接入中介軟體,開啟雙寫後線上線下資料一致性逐步提高,達到了遷移資料的目標。
每個公司對於訂單量的監控是不可或缺的,攜程有一個統一預警平臺Sitemon,它主要監控各類訂單告警,包括酒店,機票,無線,高鐵,度假。並能按照online/offline,國內/國際,或者支付方式單獨搜尋和展現,並對各類訂單做了告警。
訂單資料從SQLServer遷移到MySQL期間,我們梳理出來依賴訂單庫的預警策略近兩百個,負責監控的相關同事對SQL Server資料來源的預警策略原樣複製一份連線MySQL資料來源。以MySQL為資料來源監控告警都新增完成後,開啟報警策略,一旦訂單量異常報警,NOC會收到兩條通知,一條來源於SQLServer資料告警,一條來源於MySQL告警,如果兩邊一致,說明灰度驗證通過。否則,不通過,需排查MySQL 監控問題。
經過一段時間的灰度驗證,兩邊報警資料一致,隨著SQLServer資料表下線(即單寫MySQL資料),以SQLServer為資料來源的預警策略也跟著及時下線。
為了做好系統安全保障工作,提高應對突發事件的能力,必要的演練壓測等是少不了的。為此,我們制定了完備的應急預案並定期組織開展應急演練——流浪地球。演練專案包括核心/非核心應用熔斷、DB熔斷、Redis熔斷、核心防火牆、交換機應急切換等。
以快取為例,為了保證快取服務的高可用,我們在演練時會下線部分節點或機器甚至切斷整個Redis服務,模擬快取雪崩、快取擊穿等場景。按照計劃,在熔斷前我們會先切斷應用的Redis存取,一步步降低Redis負載,然後熔斷Redis,以此檢驗在無Redis的情況下各應用系統是否能夠正常運轉。
但在首次演練中,熔斷Redis後應用報錯量就急劇上升,果斷停止演練回退並查詢原因。經過分析,部分應用Redis操作未統一收口,不受中介軟體統一控制,Redis熔斷後應用隨即出現異常。針對這一情況,我們分析後一方面將報錯應用的訂單快取存取收口接入中介軟體,另一方面強化了中介軟體與Redis的弱依賴關係,支援一鍵斷開Redis操作,並完善了各項指標監控。最終在第二次演練中順利完成Redis熔斷,各業務系統在全流量打入MySQL的狀態下的正常執行。在最近一次的流浪地球演練中,機房網路阻斷、非核心應用阻斷等一輪輪故障注入後,我們的系統更是取得了很好的預期效果。
就這樣,在一次次的演練中,我們發現問題,總結經驗,優化系統,完善應急預案,一步步提升系統應對突發故障的能力,保證業務的連續性以及資料的完整性。做好底層資料支撐,為整個酒店訂單系統保駕護航。
雖然我們有完善的監控看板與預警系統,但對於像熔斷演練、自動化故障演練、硬體故障和維護以及不可提前預知的問題,若剛好核心開發人員未能及時在現場響應操作,系統尚不能完全自主降級可能導致部分效能有所下降,比如響應耗時增加等。在將來計劃增加手工調控看板,授權後可以讓NOC或者TS進行鍼對性操作,比如Redis全部或者部分叢集宕機,可以一鍵切割故障Redis分片,或者根據Redis已計劃中的不可用時間段來提前設定切割時間,可以最大程度保證系統的可控性。
既然可以手工進行調控,那麼我們也考慮後續可以通過一些核心指標的監控,比如Redis主從切換期間,正常情況是秒級,但是我們也出現過部分Redis 10秒以上不可寫的情況,此時可以監控快取與資料庫不一致的髒資料量,也可以在Redis發生故障時通過監控響應耗時異常的閥值來應用一些策略,讓中介軟體自動降級切割掉這些故障主機保證服務的基本穩定,然後在探測到叢集指標穩定後再逐步嘗試恢復。
當前訂單團隊內部是以JAR的方式使用中介軟體,由中介軟體來遮蔽資料庫底層差異和操作Redis以實現更復雜的功能,天然具備接入Service Mesh能力,接入後底層升級更加快速和無感、呼叫更加輕量化、更好與框架進行網格化整合以及上雲更加方便,能夠更好的支撐攜程的國際化戰略目標。
到此這篇關於SQL Server攜程核心系統無感遷移到MySQL實戰的文章就介紹到這了,更多相關SQL Server遷移到MySQL內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45