mysql創(chuàng)建視圖 MySQL主從復(fù)制能完美解決數(shù)據(jù)庫(kù)的單點(diǎn)問題嗎?為什么?
MySQL主從復(fù)制能完美解決數(shù)據(jù)庫(kù)的單點(diǎn)問題嗎?為什么?使用主從時(shí),實(shí)際上放棄了強(qiáng)一致性。由于受試者只問一個(gè)問題,我們不考慮訪問次數(shù)的問題。換句話說,假設(shè)主從復(fù)制可以完全支持當(dāng)前的系統(tǒng)訪問。)通用數(shù)據(jù)
MySQL主從復(fù)制能完美解決數(shù)據(jù)庫(kù)的單點(diǎn)問題嗎?為什么?
使用主從時(shí),實(shí)際上放棄了強(qiáng)一致性。由于受試者只問一個(gè)問題,我們不考慮訪問次數(shù)的問題。換句話說,假設(shè)主從復(fù)制可以完全支持當(dāng)前的系統(tǒng)訪問。)
通用數(shù)據(jù)庫(kù)主從設(shè)置:
主數(shù)據(jù)庫(kù)可以讀寫
即系統(tǒng)可以同時(shí)從主數(shù)據(jù)庫(kù)和從數(shù)據(jù)庫(kù)獲取數(shù)據(jù)。數(shù)據(jù)寫入主庫(kù)后,會(huì)自動(dòng)同步到從庫(kù)。
這構(gòu)成了一個(gè)簡(jiǎn)單的分布式系統(tǒng)。根據(jù)cap定理,三個(gè)中只能選擇一個(gè)。如果一致性很強(qiáng),則不會(huì)提高系統(tǒng)的可用性,反而會(huì)降低系統(tǒng)的可用性。
讓我們看看上面的主從結(jié)構(gòu)中可能出現(xiàn)什么問題:
系統(tǒng)寫入主數(shù)據(jù)庫(kù),然后從主數(shù)據(jù)庫(kù)進(jìn)行查詢。這是一個(gè)單點(diǎn)數(shù)據(jù)庫(kù),沒有影響。
-如果數(shù)據(jù)已同步,則沒有影響
-如果數(shù)據(jù)未同步,則會(huì)查詢舊數(shù)據(jù)
-如果同步有問題,則會(huì)斷開主設(shè)備和從設(shè)備的連接。如果系統(tǒng)無(wú)法感知它,那么查詢可能總是舊數(shù)據(jù)。這里我們需要監(jiān)視同步。當(dāng)同步出現(xiàn)問題時(shí),我們應(yīng)該及時(shí)處理
掛斷庫(kù)。主數(shù)據(jù)不能與從數(shù)據(jù)同步。如果主從交換機(jī)是自動(dòng)的,單點(diǎn)故障的概率只會(huì)降低50%(如果主數(shù)據(jù)庫(kù)或備用數(shù)據(jù)庫(kù)發(fā)生故障,并且沒有人恢復(fù))。
為什么數(shù)據(jù)庫(kù)字段需要設(shè)置默認(rèn)值?
懷疑的原因是MySQL的嚴(yán)格模式?jīng)]有啟用,許多隨快速開發(fā)環(huán)境提供的MySQL(phpnow、Wamp、AppServ等)甚至在某些生產(chǎn)環(huán)境中也沒有啟用嚴(yán)格模式。
在非嚴(yán)格模式下,MySQL將容忍許多開發(fā)遺漏。例如,在varcaht中插入一個(gè)100長(zhǎng)度的字符串只會(huì)截?cái)嗳哂嗖糠侄粫?huì)報(bào)告錯(cuò)誤。嚴(yán)格模式檢查數(shù)據(jù)的格式、長(zhǎng)度和類型。您發(fā)布的表創(chuàng)建語(yǔ)句指定默認(rèn)值。如果此時(shí)未指定默認(rèn)值,則當(dāng)您認(rèn)為將啟用默認(rèn)值時(shí),將返回#1364錯(cuò)誤。
最好在開發(fā)階段使用嚴(yán)格模式,這是對(duì)我們的代碼嚴(yán)格性的測(cè)試。嚴(yán)格的in和wide-out還可以保證向產(chǎn)品環(huán)境的順利轉(zhuǎn)移以及隨后的數(shù)據(jù)庫(kù)遷移和重構(gòu)。
為什么數(shù)據(jù)庫(kù)要設(shè)置默認(rèn)值?因?yàn)槲覀兿M诓迦霐?shù)據(jù)時(shí),MySQL可以按照您期望的方式處理有意或無(wú)意忽略的字段,比如一些默認(rèn)的正常狀態(tài)碼、用戶插入數(shù)據(jù)時(shí)沒有設(shè)置的文本字段等等。
我的習(xí)慣是任何數(shù)據(jù)表的任何列都不為空。在此基礎(chǔ)上,數(shù)字默認(rèn)設(shè)置為0,文本默認(rèn)設(shè)置為“”(在phpMyAdmin中留空)。null和“”之間有區(qū)別,我對(duì)此知之甚少。我之所以使用“”是因?yàn)楦鶕?jù)語(yǔ)義,null表示“此字段的值為空”,而“”表示“此字段的值尚未設(shè)置”。另一個(gè)原因是,在MyISAM引擎下,null在索引、索引統(tǒng)計(jì)和磁盤占用方面有額外的開銷。對(duì)于允許null的列,每個(gè)字段的長(zhǎng)度比not null的長(zhǎng)度長(zhǎng)1位。我不確定這幾年是否有所改善。關(guān)于null的大部分信息都是在MySQL 5.0中讀取的。
請(qǐng)直接修改我的答案。非常感謝。