<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[小小工程師的日常筆記]]></title> 
<link>https://xdeath.tw/index.php</link> 
<description><![CDATA[]]></description> 
<language>zh-tw</language> 
<copyright><![CDATA[小小工程師的日常筆記]]></copyright>
<item>
<link>https://xdeath.tw/read.php?71</link>
<title><![CDATA[mongodb(二)]]></title> 
<author>admin &lt;tszheng@twnic.net.tw&gt;</author>
<category><![CDATA[資料庫]]></category>
<pubDate>Wed, 07 Feb 2018 08:03:38 +0000</pubDate> 
<guid>https://xdeath.tw/read.php?71</guid> 
<description>
<![CDATA[ 
	接續上一篇，不管是什麼資料庫基本上的功能大概就幾種<br/><br/>新增資料、刪除資料、更新資料、查詢資料等...<br/><br/>這點mongodb跟mysql或是其他關聯式資料庫基本上都是一致的<br/><br/>不管任何操作第一步都需要指定哪個資料庫( use dbname)<br/><br/><span style="color: #DC143C;"><span style="font-size: 24px;">===新增===</span></span><br/><br/>由於mongodb不必事先定義欄位，所以新增的時候也不用先建立資料庫跟資料表<br/><br/>use dbname，insert data到collection，這個collection就會自動產生了<br/><br/>現在要新增一個資料庫叫mongodb-test，以及存入一筆資料到test-collection<br/><br/>use mongodb-test<br/><br/>db.test-collection.insert(&#123;資料&#125;)<br/><br/>資料基本上就是用json的格式儲存<br/><br/><span style="color: #DC143C;"><span style="font-size: 24px;">===搜尋===</span></span><br/><br/>接著我要搜尋某個collections的資料，語法大概如下<br/><br/>db.collection.find(&#123;條件&#125;,&#123;欄位&#125;)<br/><br/>db.collection.find(&#123;"name":"tszheng"&#125;)&nbsp;&nbsp;#查詢name=tszheng的資料<br/><br/>db.collection.find(&#123;&#125;,&#123;"score":&#123;$gt:60&#125;&#125;)&nbsp;&nbsp;#查詢score大於60的資料<br/><br/>db.collection.find(&#123;&#125;,&#123;"type":0&#125;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#查詢的結果不顯示type這個欄位<br/><br/>db.collection.findOne()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #查詢最近的一筆資料<br/><br/>db.collection.find().sort(&#123;"欄位":1&#125;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#對欄位進行正/反向排序，python的寫法不一樣<br/><br/>db.collection.find().count()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#查詢出來結果的數量<br/><br/>db.collection.find().limit(100)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #顯示100筆查詢的結果<br/><br/>另外因為mongodb欄位很自由，不是每筆資料都有所有欄位，所以還可以查詢xxx欄位存在的資料<br/><br/>db.collection.find(&#123;"xxx":&#123;$exists:true&#125;&#125;)<br/><br/><span style="color: #DC143C;"><span style="font-size: 24px;">===刪除===</span></span><br/><br/>刪除比較簡單，find的條件搜尋出來的結果要刪除，就把find改成remove就可以了<br/><br/>db.collection.remove(&#123;條件&#125;)<br/><br/>要全刪的時候也不要忘記要下條件<br/><br/>db.collection.remove(&#123;&#125;)<br/><br/><span style="color: #DC143C;"><span style="font-size: 24px;">===更新===</span></span><br/><br/>db.collection.update(&#123;'xxx':'條件'&#125;,&#123;$set:&#123;'xxx':'新資料'&#125;&#125;,&#123;multi:true&#125;)<br/><br/>後面的multi:true是指符合此條件的資料全部進行更新，如果沒有這個參數則會更新符合條件最新的一筆資料<br/><br/><span style="color: #DC143C;"><span style="font-size: 24px;">===python進行資料庫操作===</span></span><br/><br/><div class="code"><br/>from pymongo import MongoClient&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#import pymongo<br/>client = MongoClient(&#039;localhost&#039;,27017)&nbsp;&nbsp;&nbsp;&nbsp;#連線<br/>db = client.collection&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#選擇資料庫<br/>db.collection.insert(&#123;&quot;title&quot;:&quot;地一筆資料&quot;,...&#125;)&nbsp;&nbsp; #插入資料<br/>rc = db.collection.find()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#搜尋資料<br/>for i in range(0,rc.count(),1):<br/>&nbsp;&nbsp;&nbsp;&nbsp;print rc&#91;i&#93;&#91;&#039;ip&#039;&#93;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 印出所有資料的ip欄位<br/></div><br/><br/>比較特殊的是如果儲存的是時間，那要用python轉成object存入<br/><br/>還有上面有提到sort的寫法在python是不一樣的<br/><br/>db.collection.find().sort("欄位",1)&nbsp;&nbsp;前後並沒有&#123;&#125;，同時欄位以及正/反排序是用 , 而不是 : <br/><br/>另外如果要查詢ObjectId他一樣是一個Object，不能直接用string下去查詢<br/><div class="code"><br/>from bson import ObjectId<br/>oid_str = &#039;5a7931de20be054518904450&#039;<br/>oid = ObjectId(oid_str)<br/></div><br/><br/>
]]>
</description>
</item><item>
<link>https://xdeath.tw/read.php?70</link>
<title><![CDATA[mongodb(一)]]></title> 
<author>admin &lt;tszheng@twnic.net.tw&gt;</author>
<category><![CDATA[資料庫]]></category>
<pubDate>Wed, 07 Feb 2018 07:33:55 +0000</pubDate> 
<guid>https://xdeath.tw/read.php?70</guid> 
<description>
<![CDATA[ 
	mongodb是近幾年流行nosql資料庫中使用率最高的一種<br/><br/>mongodb與關聯式資料庫主要差在他是使用json儲存<br/><br/>事先不定義欄位，同時不保證一致性的資料庫<br/><br/>如果你需要很精確的數字與資料，需要交易或是rollback的功能，那就不適合使用mongodb<br/><br/><span style="color: #DC143C;"><span style="font-size: 24px;">===安裝mongodb===</span></span><br/><br/>作業系統 ubuntu&nbsp;&nbsp;mongodb版本2.6<br/><br/>apt-get install mongodb<br/><br/>因為後面可能需要使用python進行操作，順便裝一下python的模組<br/><br/>apt-get install python-pymongo<br/><br/>安裝好啟動後預設是listen 27017 port，可以使用指令mongo進入<br/><br/><span style="color: #DC143C;"><span style="font-size: 24px;">===基本操作===</span></span><br/><br/>一開始是沒有任何權限設定的，進入後可以查看資料庫以及資料表(collections)<br/><br/>show dbs(查看資料庫)&nbsp;&nbsp;show collections(查看資料表)<br/><br/>使用哪一個資料庫<br/><br/>use dbname<br/><br/>使用哪一個資料表<br/><br/>db.dbname.動作(find,update,insert,remove...)<br/><br/><span style="color: #DC143C;"><span style="font-size: 24px;">===權限管理===</span></span><br/><br/>mongodb的的使用者是跟著資料庫走的，例如你有ABC三個資料庫<br/><br/>可以同時在三個資料庫都建立一個tszheng的帳號<br/><br/>在哪個資料庫新增帳號就是代表僅新增該資料庫的帳號，<br/><br/>use admin<br/><br/>db.addUser("username","passwd",true)&nbsp;&nbsp; #true為唯讀帳號，不加則可讀寫<br/><br/>新增完畢之後，還需要修改設定檔/etc/mongodb.conf<br/><br/>有一個#auth = true，將#拿掉後重啟mongodb<br/><br/>下次再進入就強制需要登入了，登入方式如下<br/><br/>mongo進入後(這時候已經沒辦法show dbs了，所以要記得dbname)<br/><br/>先選擇資料庫 use dbname<br/><br/>db.auth("dbname","passwd") (登入)<br/><br/>如果回應1就表示登入成功了<br/><br/><span style="color: #DC143C;"><span style="font-size: 24px;">===資料===</span></span><br/><br/>如前面所說的，mongodb是用json的方式儲存資料，資料大概長得像下面<br/><br/>&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"_id" : ObjectId("5a7931de20be054518904450"),<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"ip" : "1.2.3.4",<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"datetime" : ISODate("2017-10-12T00:39:03Z"),<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"resp_time" : NumberLong(4),<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"type" : "udp",<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"idc" : NumberLong(1)<br/>&#125;<br/><br/>每一筆資料都有一個ObjectId為key，如一開始說的，他的欄位不需要事先定義<br/><br/>欄位也很自由，你可以這筆資料有四個欄位，下一筆資料有六個欄位，都不會影響整個資料庫運作。<br/><br/>另外如果這個mongodb資料庫要對外開放連線，則要修改設定檔/etc/mongodb.conf<br/><br/>中的bind_ip，設定能夠連線進來的IP後重啟服務即可。
]]>
</description>
</item><item>
<link>https://xdeath.tw/read.php?55</link>
<title><![CDATA[資料庫交易(事務)、MVCC以及效能比較]]></title> 
<author>admin &lt;tszheng@twnic.net.tw&gt;</author>
<category><![CDATA[資料庫]]></category>
<pubDate>Wed, 03 Aug 2016 04:17:46 +0000</pubDate> 
<guid>https://xdeath.tw/read.php?55</guid> 
<description>
<![CDATA[ 
	資料庫的交易(事務)概念，最簡單的說法就是一個交易的所有SQL<br/><br/>只能全部成功，或是全部失敗兩種狀況<br/><br/>不能有前一個SQL成功，後面兩個SQL失敗<br/><br/>所以資料庫在設計上必須要有ACID的特性<br/><br/><span style="font-size: 18px;">Atomicity(原子性)</span><br/><br/>一個交易必須被視為一個不可分割的工作單元<br/><br/>交易中的操作要麼全部成功，要麼全部失敗回滾(rollback)。 <br/><br/><span style="font-size: 18px;">Consistency(一致性)</span><br/><br/>數據庫總是從一個一致性的狀態轉換到另外一個一致性的狀態<br/><br/>以銀行交易為例，A轉帳200元給B，A減少200，B增加200<br/><br/>這符合銀行存款的性質-錢是不會憑空增加或減少的<br/><br/><span style="font-size: 18px;">Isolation(隔離性)</span><br/><br/>一個交易尚未提交(commit)之前，代表未完成<br/><br/>對其他交易來說是看不到他提交尚未成功時所做的動作的<br/><br/><span style="font-size: 18px;">Durability(持久性)</span><br/><br/>一旦事務提交，則其所作的修改就會永久的保存到數據庫中<br/><br/>即使此時數據庫崩潰，修改的數據也不會消失。 <br/><br/><hr/><br/><br/><span style="font-size: 24px;"><span style="color: #FF0000;">MVCC與隔離層級</span></span><br/><br/>隔離層級是RDBMS針對資料庫的標準規範<br/><br/>要談到隔離層級以及MVCC前，我們需要先了解交易過程中如果沒有進行lock<br/><br/>可能會產生哪些問題<br/><br/><span style="font-size: 18px;">更新遺失(lost update)</span><br/><br/>AB前後對一筆row data做更新，A更新完畢了，但是B卻更新失敗而rollback<br/><br/>這樣row data就會變回A未更新的狀態，但是A更新是成功的<br/><br/><span style="font-size: 18px;">讀取錯誤(dirty read)</span><br/><br/>A對row data進行更新但尚未commit，這時候B去讀到了尚未commit的資料<br/><br/>這時候的資料可能會是錯的，因為A的commit不是一定成功的，有可能會rollback<br/><br/><span style="font-size: 18px;">無法重複的讀取(unrepeatable read)</span><br/><br/>A的交易兩次讀取row data，中間卻被B交易更動了row data的資料<br/><br/>那A交易兩次就可能產生不一致的結果，這對交易來說是不允許的<br/><br/><span style="font-size: 18px;">幻讀(phantom read)</span><br/><br/>狀況如同unrepeatable read，只是問題出在資料筆數會有問題<br/><br/>而不是資料的值產生問題<br/><br/><hr/><br/><br/>為了處理以上這幾種交易產生的狀況，最簡單的方式就是每一筆的交易要完全隔離或獨立<br/><br/>例如A交易在進行時，其他交易就排隊，等待A交易完成後再進行B交易<br/><br/>但是實務上這種使用lock table來讓交易強制排隊的方式會嚴重的拖慢資料庫的效能<br/><br/>試想原本每秒預計要處理2000筆交易資料，結果某一筆交易程式執行花了三秒鐘<br/><br/>後面1999筆的交易通通要等三秒，在實務上這完全是不合理的狀況<br/><br/>因此實務上會根據資料讀寫更新的頻繁性，設定不同的交易隔離層級(transaction isolation level)<br/><br/>嚴謹的程度是由低到高<br/><br/><span style="font-size: 18px;">未提交讀取(read uncommited)</span><br/><br/>交易進行時，尚未提交的資料，對其他的交易來說是可以看的到的<br/><br/><span style="font-size: 18px;">提交讀取(read commited)</span><br/><br/>交易過程中只能看到其他交易已經提交的資料<br/><br/><span style="font-size: 18px;">可重複讀(repeatable read)</span><br/><br/>交易在讀取時不會限制其他讀取的交易，但是禁止針對這些資料做更新<br/><br/>或是其他交易更新先寫到暫存表格<br/><br/><span style="font-size: 18px;">序列化執行(serializable)</span><br/><br/>直接鎖住表格(lock table)，如同前面說的，嚴重影響效能，但是安全性最高<br/><br/>隔離級別&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;讀取錯誤&nbsp;&nbsp; 無法重複讀取&nbsp;&nbsp;幻讀 <br/>read uncommited&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; yes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;yes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;yes <br/>read commited&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; no&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;yes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;yes <br/>repeatable read&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; no&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;no&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;yes <br/>serializable&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; no&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; no&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;no <br/><br/>MVCC中文稱多版本並發控制，因為除非使用序列化執行<br/><br/>要不然一定都會碰到幻讀的問題，MVCC是一種lock的變形<br/><br/>實現了非阻塞的讀，寫操作也只鎖定必要的行，來解決幻讀的問題<br/><br/>Mysql、Postgresql、Oracle各家實現MCVV的做法不一樣<br/><br/>另外Postgresql與Oracle使用的是read commited層級<br/><br/>而Mysql使用的是repeatable read，因此在效能上Mysql應該是比較差的<br/><br/>但是如果你的資料庫並不需要用的交易的功能(或是AP曾能夠自行處理，或允許小錯誤)<br/><br/>Mysql的MyISAM型態(預設)的資料表是關閉了交易功能(InnoDB才開啟)<br/><br/>關閉了交易的mysql應該是三種裡面效能最快的(不過現在mariadb 10應該更勝一籌了)<br/><br/>這方面就是資料庫管理人員與AP開發人員在定schema的時候要考量的了
]]>
</description>
</item><item>
<link>https://xdeath.tw/read.php?51</link>
<title><![CDATA[mysql view]]></title> 
<author>admin &lt;tszheng@twnic.net.tw&gt;</author>
<category><![CDATA[資料庫]]></category>
<pubDate>Thu, 14 Jul 2016 07:39:11 +0000</pubDate> 
<guid>https://xdeath.tw/read.php?51</guid> 
<description>
<![CDATA[ 
	當我們在使用資料庫，有些table的欄位可能非常的多<br/><br/>而臨時我們在搜尋時只需要對某幾個欄位作運算<br/><br/>或是當我需要關聯不同的table作很多次搜尋時<br/><br/>每做一次搜尋就作一次join是非常浪費資源的事情<br/><br/>因此mysql有提供一個view的功能可以將join後的那張暫存table存起來<br/><br/>當你偶爾需要作一些統計、報表之類的事情，又不希望另外再開一張表來儲存你要的資料<br/><br/>建立一個view就是一種能節省資源，也不會破壞整個資料庫的資料結構的方式<br/><br/>這張view tables也會同時與原始的資料同步，讓我們在搜尋的時候會更加便利，節省資源<br/><br/>舉例 table_A有&nbsp;&nbsp;ID ,A_1, A_2, A_3 ， table_B也有&nbsp;&nbsp;ID,B_1, B_2, B_3<br/><br/>我要查詢的時候要把兩張表用ID連結在一起作成一個臨時的表C<br/><br/>其中包含表A的A_1，A_2以及表B的B_1<br/><br/>create view table_C as select table_A.A_1,&nbsp;&nbsp;table_A.A_2, table_B.B1&nbsp;&nbsp;from table_A left join table_B on table_A.ID = table_B.ID<br/><br/>這樣就可以建立一個包含兩張表各自欄位的暫時用的表，但是實際上你可以針對這張表作一些update<br/><br/>但是insert, delete 是不行的
]]>
</description>
</item><item>
<link>https://xdeath.tw/read.php?45</link>
<title><![CDATA[Oracle 帳號密碼過期]]></title> 
<author>admin &lt;tszheng@twnic.net.tw&gt;</author>
<category><![CDATA[資料庫]]></category>
<pubDate>Tue, 14 Jun 2016 01:51:22 +0000</pubDate> 
<guid>https://xdeath.tw/read.php?45</guid> 
<description>
<![CDATA[ 
	Oracle 11G每組帳號的密碼預設都有180天的期限<br/><br/>假如連接到DB時出現 the password will expire within 7 days<br/><br/>這個原因是因為11g在default profile 設定 180 天要修改密碼<br/><br/>SELECT * FROM dba_profiles s WHERE s.profile='DEFAULT' AND resource_name='PASSWORD_LIFE_TIME';<br/><br/>最快的方法就是更改該user的密碼,不過還是換成同一個<br/><br/>另一個一勞永逸的方法就是更改profile的設定.<br/><br/>ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;<br/><br/>＊＊最後使用管理者進入再重新修改一次密碼＊＊<br/><br/>$sqlplus / as sysdba<br/><br/>alter user username identified by&nbsp;&nbsp;原來的密碼;<br/>
]]>
</description>
</item><item>
<link>https://xdeath.tw/read.php?44</link>
<title><![CDATA[Mysql 存在即更新語法]]></title> 
<author>admin &lt;tszheng@twnic.net.tw&gt;</author>
<category><![CDATA[資料庫]]></category>
<pubDate>Thu, 26 May 2016 08:57:21 +0000</pubDate> 
<guid>https://xdeath.tw/read.php?44</guid> 
<description>
<![CDATA[ 
	當我們在處理資料庫資料的時候，有時候會碰到一種情況<br/><br/>就是當沒有這筆資料時，我們就insert進去<br/><br/>而這筆資料已經存在時，我們就更新相關的欄位<br/><br/>當然用程式先做select這筆資料的key是否存在，在判斷insert還是update也是可以<br/><br/>但是實際上量大的時候，其實是相當的消耗效能的<br/><br/>實際上Mysql本身有提供一個命令可以一次處理完<br/><br/>INSERT INTO `table` (`key`,`data1`, `data2`,) VALUES ('key','data1','data2') ON DUPLICATE KEY UPDATE data1= 'xxx', data2='yyy'<br/><br/>也就是在insert後面加上ON DUPLICATE KEY UPDATE <br/><br/>然後接上我們要更新的資料欄位即可<br/><br/>這樣如果碰到主鍵(key)已經存在的資料，就不會再insert，會直接更新data1以及data2<br/><br/>如果主鍵不存在，就會直接insert
]]>
</description>
</item><item>
<link>https://xdeath.tw/read.php?40</link>
<title><![CDATA[centos 6 安裝oracle 11G(二)]]></title> 
<author>admin &lt;tszheng@twnic.net.tw&gt;</author>
<category><![CDATA[資料庫]]></category>
<pubDate>Wed, 24 Feb 2016 03:46:25 +0000</pubDate> 
<guid>https://xdeath.tw/read.php?40</guid> 
<description>
<![CDATA[ 
	安裝完Oracle後，接著切換回command介面，切換oracle的身分 su - oracle<br/><br/>修改~/.bash_profile參數<br/><br/>PATH=$PATH:$HOME/bin<br/>export ORACLE_BASE=/app/oracle<br/>export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/dbhome_1<br/>export ORACLE_SID=[dbname]<br/>export TNS_ADMIN=$ORACLE_HOME/network/admin<br/>export LD_LIBRARY_PATH=$&#123;LD_LIBRARY_PATH&#125;:/lib:/usr/lib:/usr/local/lib:$ORACLE_HOME/oracm/lib:$ORACLE_HOME/lib<br/>export ORA_CRS_HOME=$ORACLE_HOME/crs<br/>export LIBPATH=$LIBPATH:$ORA_CRS_HOME/lib:$ORACLE_HOME/lib<br/>export PATH=$ORACLE_HOME/bin:$ORA_CRS_HOME/bin:$&#123;PATH&#125;:$HOME/bin<br/>export EDITOR=vim<br/>export NLS_LANG="american_america.UTF8";<br/>#big5 american_america.ZHT16BIG5<br/><br/>請記得[dbname]不可以超過八個字元，超過的話後面create database會失敗<br/><br/>建立oracle的參數設定檔，cd $ORACLE_HOME/dbs，複製init.ora成init[dbname].ora<br/><br/>記得檔名一定要依照這個格式，要不然一樣啟動的時候會出錯<br/><br/>裡面的設定如下<br/><br/>compatible = 11.2.0<br/>control_files = '$ORACLE_BASE/oradata/control01.ora','/$ORACLE_BASE/oradata/control02.ora'<br/>db_block_size=8192<br/>db_name="[dbname]"<br/>db_domain=[domain]<br/>instance_name="[dbname]"<br/>service_names="[dbname]"<br/>diagnostic_dest=$ORACLE_BASE/diag<br/>DB_RECOVERY_FILE_DEST=$ORACLE_BASE/flash_recovery_area<br/>DB_RECOVERY_FILE_DEST_SIZE=2G<br/>log_buffer = 262144<br/>PGA_AGGREGATE_TARGET=300M<br/>workarea_size_policy=auto<br/>SGA_TARGET=500M<br/>processes = 300<br/>remote_login_passwordfile=exclusive<br/>undo_management = auto<br/>undo_tablespace = undotbs<br/><br/>#------------------------建密碼擋<br/>orapwd file=$ORACLE_HOME/dbs/orapwd11g password=dbpasswd entries=10<br/><br/>#------------------------以下是開啟archivelog的設定<br/>log_archive_dest_1 = "LOCATION=/app/oracle/oradata/ts/ARCHIVE1/MANDATORY"<br/>log_archive_dest_2 = "LOCATION=/app/oracle/oradata/ts/ARCHIVE2/MANDATORY"<br/>log_archive_format = "arch%t_%s_%r.arc"<br/>log_archive_max_processes=2<br/><br/>#-------------------------資料庫優化<br/>max_dispatchers=20<br/>max_shared_servers=20<br/>dispatchers= "(PROTOCOL=TCP)(dispatchers=12)"<br/>shared_servers=8<br/>local_listener=[dbname]&nbsp;&nbsp;# /etc/hosts&nbsp;&nbsp;#??<br/>open_cursors = 200<br/>audit_sys_operations = false&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#關閉audit log，因為預設是把LOG存在system space中&nbsp;&nbsp;?????<br/><br/>檢查一下是不是所有的路徑是否都存在，接著我們建立一個ramdisk作為sort暫存用<br/><br/>mkdir /mnt/ramdisk<br/>mount -t tmpfs -o size=4G tmpfs /mnt/ramdisk<br/><br/>預設開機掛載 vim /etc/fstab<br/>在最後面增加一行<br/>tmpfs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /mnt/ramdisk&nbsp;&nbsp;&nbsp;&nbsp;tmpfs&nbsp;&nbsp; rw,relatime,size=4G 0 0<br/><br/>同時安裝一個模組讓sqlplus可以支援上下鍵<br/><br/>rpm -ivh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm<br/>rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6<br/>yum -y install rlwrap readline readline-devel&nbsp;&nbsp;<br/>在~/.bash_profile最底下加上<br/>alias sqlplus='rlwrap sqlplus' <br/>alias rman='rlwrap rman'<br/><br/>這樣等下操作會方便很多，接著用oracle的身分建立一個目錄等下可以放log、table space以及archivelog<br/><br/>mkdir /app/oracle/oradata/log<br/>mkdir /app/oracle/oradata/ts<br/>mkdir /app/oracle/oradata/ts/ARCHIVE1<br/>mkdir /app/oracle/oradata/ts/ARCHIVE2<br/>mkdir $ORACLE_BASE/flash_recovery_area<br/>就可以使用sqlplus與DB進行連線以及建立資料庫了<br/><br/>sqlplus /nolog<br/>SQL> connect /as sysdba<br/>SQL> startup nomount<br/>SQL> CREATE DATABASE [dbname]<br/>&nbsp;&nbsp; USER SYS IDENTIFIED BY [passwd] (sys 系統使用者密碼)<br/>&nbsp;&nbsp; USER SYSTEM IDENTIFIED BY [passwd] (system 系統使用者密碼)<br/>&nbsp;&nbsp; LOGFILE GROUP 1 ('/app/oracle/oradata/log/redo01a.log','/app/oracle/oradata/log/redo01b.log') SIZE 100M,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GROUP 2 ('/app/oracle/oradata/log/redo02a.log','/app/oracle/oradata/log/redo02b.log') SIZE 100M<br/>&nbsp;&nbsp; MAXLOGFILES 5<br/>&nbsp;&nbsp; MAXLOGMEMBERS 5<br/>&nbsp;&nbsp; MAXLOGHISTORY 1<br/>&nbsp;&nbsp; MAXDATAFILES 100<br/>&nbsp;&nbsp; CHARACTER SET UTF8<br/>&nbsp;&nbsp; NATIONAL CHARACTER SET UTF8<br/>&nbsp;&nbsp; EXTENT MANAGEMENT LOCAL<br/>&nbsp;&nbsp; datafile&nbsp;&nbsp;&nbsp;&nbsp; '/app/oracle/oradata/ts/sys.dbf'&nbsp;&nbsp;&nbsp;&nbsp; size 512M&nbsp;&nbsp;(系統檔)<br/>&nbsp;&nbsp; sysaux datafile '/app/oracle/oradata/ts/sysaux.dbf' size 512M<br/>&nbsp;&nbsp; DEFAULT TABLESPACE users&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(使用者的table space)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DATAFILE '/app/oracle/oradata/ts/users01.dbf'<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SIZE 1024M&nbsp;&nbsp;AUTOEXTEND ON MAXSIZE UNLIMITED<br/>&nbsp;&nbsp; DEFAULT TEMPORARY TABLESPACE tempts1&nbsp;&nbsp;&nbsp;&nbsp;(sorting時的table space)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TEMPFILE '/mnt/ramdisk/temp01.dbf'&nbsp;&nbsp;#放ramdisk搜尋會比較快<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SIZE 1024M AUTOEXTEND ON MAXSIZE UNLIMITED<br/>&nbsp;&nbsp; UNDO TABLESPACE undotbs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(commit前的table space)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DATAFILE '/app/oracle/oradata/ts/undotbs.dbf'<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SIZE 1024M&nbsp;&nbsp;AUTOEXTEND ON MAXSIZE UNLIMITED<br/>&nbsp;&nbsp;SET TIME_ZONE ='+08:00';<br/><br/>接著建立data用的table space，記得開存資料用的資料表時<br/><br/>一定要指定放到data的table space，要不然預設會放在system的table space<br/><br/>當system的table space爆掉的時候，就會發生很嚴重的後果<br/><br/>CREATE TABLESPACE [dataspace] DATAFILE '/app/oracle/oradata/ts/[dataname]01.dbf' SIZE 5120M<br/>AUTOEXTEND ON<br/>NEXT 8192K MINIMUM EXTENT 512K<br/>DEFAULT STORAGE ( INITIAL 8192K NEXT 8192K MINEXTENTS 2 MAXEXTENTS 15000<br/>PCTINCREASE 0);<br/>Alter tablespace [dataspace]ADD DATAFILE '/app/oracle/oradata/ts/[dataspace]02.dbf' SIZE 2048M;<br/>Alter tablespace [dataspace]ADD DATAFILE '/app/oracle/oradata/ts/[dataspace]03.dbf' SIZE 2048M;<br/>Alter tablespace [dataspace]ADD DATAFILE '/app/oracle/oradata/ts/[dataspace]04.dbf' SIZE 2048M;<br/><br/>如果資料量會越來越大的話記得開啟autoextend on<br/><br/>到這邊如果出現問題，要重新建立資料庫的話，就到/app/oracle/oradata資料夾內<br/><br/>將所建立的檔案全數刪除，如果刪不乾淨建立的時候就會出錯<br/><br/>接著建立index的table space<br/><br/>CREATE TABLESPACE DNSINDEX DATAFILE '/app/oracle/oradata/ts/index01.dbf' SIZE 1024M REUSE<br/>AUTOEXTEND ON NEXT 1280K<br/>MINIMUM EXTENT 128K<br/>DEFAULT STORAGE ( INITIAL 128K NEXT 128K MINEXTENTS 1 MAXEXTENTS 8192 PCTINCREASE 0);<br/><br/>接下來作不知道幹嘛用的(data dictionaries)，記得不要跳出sqlplus哦<br/><br/>@$ORACLE_HOME/rdbms/admin/catalog.sql<br/>@$ORACLE_HOME/rdbms/admin/catproc.sql<br/>@$ORACLE_HOME/sqlplus/admin/pupbld.sql<br/><br/>開啟archive log功能<br/><br/>shutdown immediate;<br/>startup mount;<br/>alter database archivelog;<br/><br/>shutdown immediate;關DB<br/>startup;&nbsp;&nbsp;開DB後面有三個參數 nomount(開DB) mount(開系統檔案) open(正常開啟)<br/><br/>檢查交易LOG功能是否正常運作<br/><br/>SQL> archive log list;<br/>Database log mode&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Archive Mode&nbsp;&nbsp;<---正常啟用中<br/>Automatic archival&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Enabled<br/>Archive destination&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/app/oracle/oradata/ts/ARCHIVE2/<br/>Oldest online log sequence&nbsp;&nbsp;&nbsp;&nbsp; 6<br/>Next log sequence to archive&nbsp;&nbsp; 7<br/>Current log sequence&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7<br/><br/>修改資料庫listen的設定$ORACLE_HOME/network/admin/listener.ora<br/><br/>現在DB只有本機可以連線，要修改$ORACLE_HOME/network/admin/listener.ora<br/>LISTENER =<br/>&nbsp;&nbsp;(DESCRIPTION_LIST =<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(ADDRESS_LIST =<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(ADDRESS = (PROTOCOL=TCP)(HOST=[dbname])(PORT=1521)(QUEUESIZE=150))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(ADDRESS = (PROTOCOL=TCP)(HOST=[ip])(PORT=1521)(QUEUESIZE=30))<br/>&nbsp;&nbsp;&nbsp;&nbsp;)<br/>&nbsp;&nbsp;)<br/><br/>SID_LIST_LISTENER =<br/>(SID_LIST =<br/> (SID_DESC =<br/>&nbsp;&nbsp;(GLOBAL_DBNAME = [dbname])<br/>&nbsp;&nbsp; (SID_NAME = [dbname])<br/>&nbsp;&nbsp;)<br/>)<br/>TRACE_LEVEL_LISTENER =OFF<br/>LOG_FILE_LISTENER = lsnr<br/><br/><br/>接著開啟oracle listener<br/><br/>lsnrctl start&nbsp;&nbsp;<br/><br/>最後建立一般使用者<br/><br/>create user [username] identified by [password] default tablespace [dataspace] temporary tablespace TEMPTS1 quota unlimited on [dataspace];<br/>#建議放在users的table space，不過選錯了其實也沒啥關係<br/>grant create session,create synonym,select any table, execute any type, select any sequence to [username];<br/>grant dba to [username];<br/><br/>最後讓oracle能夠開機啟動<br/><br/>vim /etc/rc.local<br/>su - oracle -c 'lsnrctl start' →以Oracle_SID的這個身分下指令把listener啟動(-c就是command)<br/>su - oracle -c 'dbstart' →以Oracle_SID的這個身分啟動DB<br/><br/>最後在到/etc/rc.local去執行這個檔案即可<br/>這樣就完成整個oracle的架設以及create一個DB與user<br/><br/>但是重開機後還是要手動進入啟動資料庫<br/><br/>sqlplus /nolog<br/>connect /as sysdba<br/>startup<br/><br/>=============================================<br/>使用system帳號匯入資料<br/><br/>imp userid=system/passwd log=/tmp/imp.log&nbsp;&nbsp;full=y grants=y indexes=n file=xxx.dmp&nbsp;&nbsp;#full匯入<br/><br/>imp userid=system/passwd log=/tmp/imp.log&nbsp;&nbsp;fromuser=dbuser touser=dbuser grants=y indexes=n file=xxx.dmp&nbsp;&nbsp;#只匯入特定使用者<br/><br/>理論上如果是full備份，所有使用者、帳號、密碼都會還原回資料庫<br/><br/>還原回去後要修改帳號密碼<br/><br/>ALTER USER&nbsp;&nbsp;使用者名稱 IDENTIFIED BY 密碼;
]]>
</description>
</item><item>
<link>https://xdeath.tw/read.php?39</link>
<title><![CDATA[centos 6 安裝oracle 11G(一)]]></title> 
<author>admin &lt;tszheng@twnic.net.tw&gt;</author>
<category><![CDATA[資料庫]]></category>
<pubDate>Tue, 23 Feb 2016 04:16:20 +0000</pubDate> 
<guid>https://xdeath.tw/read.php?39</guid> 
<description>
<![CDATA[ 
	oracle每個版本可能都不大一樣<br/><br/>所以首先聲明我的環境是centos 6.2 x86_64，安裝的是oracle 11g<br/><br/>首先進行對時(沒有對時會發生什麼事我也不曉得，反正前輩的筆記)<br/><br/>vim /etc/ntp.conf<br/>service ntpd restart<br/>chkconfig ntpd on&nbsp;&nbsp;<br/><br/>接著安裝必要的模組<br/><br/>yum install cloog-ppl compat-libcap1 compat-libstdc++-33 cpp gcc gcc-c++ glibc-devel glibc-headers kernel-headers libXmu libXt ksh libXxf86misc libXxf86vm libaio-devel libdmx libstdc++-devel mpfr make ppl xorg-x11-utils xorg-x11-xauth libXv libXxf86dga<br/><br/>防火牆開啟1521、1158 port<br/><br/>修改系統參數<br/><br/>修改/etc/sysctl.conf<br/><br/>vm.swappiness = 0<br/>vm.dirty_background_ratio = 3<br/>vm.dirty_ratio = 80<br/>vm.dirty_expire_centisecs = 500<br/>vm.dirty_writeback_centisecs = 100<br/>kernel.shmmax = 68719476736<br/>kernel.shmall = 4294967296<br/>kernel.shmmni = 4096<br/>kernel.sem = 250 32000 100 128<br/>net.ipv4.ip_local_port_range = 9000 65500<br/>net.core.rmem_default = 262144<br/>net.core.rmem_max = 4194304<br/>net.core.wmem_default = 262144<br/>net.core.wmem_max = 4194304<br/>fs.aio-max-nr = 1048576<br/>net.ipv6.conf.all.disable_ipv6 = 1<br/>net.ipv6.conf.default.disable_ipv6 = 1<br/><br/>重新讀取 sysctl -p<br/><br/>修改/etc/security/limits.conf<br/><br/>oracle soft nproc 2047<br/>oracle hard nproc 16384<br/>oracle soft nofile 1024<br/>oracle hard nofile 65536<br/>oracle soft stack 10240<br/>oracle hard stack 32768<br/>grid soft nproc 2047<br/>grid hard nproc 16384<br/>grid soft nofile 1024<br/>grid hard nofile 65536<br/>grid soft stack 10240<br/>grid hard stack 32768<br/><br/>修改 /etc/pam.d/login <br/><br/>session required pam_limits.so<br/><br/>建立dba的群組<br/><br/>groupadd dba<br/><br/>建立一個帳號oracle(oracle專用)<br/><br/>useradd -G dba oracle<br/><br/>接著用oralce的身分在~/.bash_profile寫入幾個設定<br/><br/>我們先設定安裝的路徑與資料庫名稱<br/><br/>export ORACLE_BASE=/app/oracle<br/>export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/dbhome_1<br/>export ORACLE_SID=[dbname]<br/><br/>ORACLE_SID表示資料庫的名稱<br/><br/>接著建立oracle要安裝的資料夾同時修改權限<br/><br/>mkdir app<br/>mkdir /app/oracle<br/>chown -R oracle:dba app<br/><br/>所以必須要讓系統能夠解析的到，修改/etc/hosts<br/><br/>[hostip]&nbsp;&nbsp;[dbname]<br/><br/>接下來進入xwindows準備安裝，首先先切換成英文語系<br/><br/>修改 /etc/sysconfig/i18n<br/><br/>LANG="zh_TW.UTF-8"&nbsp;&nbsp;改為&nbsp;&nbsp;LANG="en_US.UTF-8"<br/><br/>接著開始安裝，將11g兩個壓縮檔解壓縮到同一個資料夾，點runinstaller<br/><br/>一開始的線上協助、proxy等可以跳過，選版本<br/><br/>安裝過程中他會問oracle安裝的幾個選項<br/><br/>若是第一次安裝oracle則會要求你設定產品目錄Oracle Inventory<br/><br/>安裝路徑就照著剛剛所建立要給oracle的安裝目錄就可以了<br/><br/>中間會問你要單純安裝oracle還是要建立DB同時設定<br/><br/>建議選擇單純安裝oracle即可，中間他會驗證一些library，如果上面那些都有安裝，驗證卻是failed<br/><br/>有可能是版本比較新，可以直接先忽略過安裝看看<br/><br/>中間會要你用root身分去執行兩個shell script<br/>(/app/oraInventory/orainstRoot.sh，/app/oracle/product/11.2.0/dbhome_1/root.sh)<br/><br/>su -<br/>cd /app/oraInventory/<br/>./orainstRoot.sh&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #主要用來變更目錄權限<br/>Changing permissions of /app/oraInventory.<br/>Adding read,write permissions for group.<br/>Removing read,write,execute permissions for world.<br/><br/>Changing groupname of /app/oraInventory to oracle.<br/>The execution of the script is complete.<br/>cd /app/oracle/product/11.2.0/dbhome_1<br/>./root.sh&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#添加 dbhome、oraenv、coraenv 三個執行檔，另外於 /etc 之下建立 oratab <br/>Running Oracle 11g root.sh script...<br/><br/>The following environment variables are set as:<br/>&nbsp;&nbsp;&nbsp;&nbsp;ORACLE_OWNER= oracle<br/>&nbsp;&nbsp;&nbsp;&nbsp;ORACLE_HOME=&nbsp;&nbsp;/app/oracle/product/11.2.0/dbhome_1<br/><br/>Enter the full pathname of the local bin directory: [/usr/local/bin]:<br/>&nbsp;&nbsp; Copying dbhome to /usr/local/bin ...<br/>&nbsp;&nbsp; Copying oraenv to /usr/local/bin ...<br/>&nbsp;&nbsp; Copying coraenv to /usr/local/bin ...<br/><br/>Creating /etc/oratab file...<br/>Entries will be added to the /etc/oratab file as needed by<br/>Database Configuration Assistant when a database is created<br/>Finished running generic part of root.sh script.<br/>Now product-specific root actions will be performed.<br/>Finished product-specific root actions.<br/><br/>到這邊oracle應該已經成功安裝在系統上了
]]>
</description>
</item><item>
<link>https://xdeath.tw/read.php?14</link>
<title><![CDATA[Mysql 同步資料庫]]></title> 
<author>admin &lt;tszheng@twnic.net.tw&gt;</author>
<category><![CDATA[資料庫]]></category>
<pubDate>Wed, 18 Jun 2014 02:29:03 +0000</pubDate> 
<guid>https://xdeath.tw/read.php?14</guid> 
<description>
<![CDATA[ 
	首先，因為Mysql的同步機制完全是基於在主資料庫上執行的增量SQL要被送到副資料庫上，並且被成功執行。<br/><br/>這就勢必要求：開啟同步機制前，主副數據庫中數據是相同的；但是在運行中仍然可能遇到不一致的產生，<br/><br/>這會導致通信無法正常繼續下去。因此一旦同步出現問題，首先應該確認是否某些SQL的語法在副資料庫無法執行<br/><br/>具體的主從mysql設定方式如下<br/><br/>================================================Master設定<br/><br/>首先在my.cnf中加入<br/><br/>server-id = 1<br/>log-bin=mysql-bin<br/>binlog_do_db = 資料庫名稱<br/><br/>重新啟動mysql後檢查是否開始運作<br/><br/>mysql> show master status;<br/>+------------------+----------+--------------+------------------+<br/>&#124; File&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124; Position &#124; Binlog_Do_DB &#124; Binlog_Ignore_DB &#124;<br/>+------------------+----------+--------------+------------------+<br/>&#124; mysql-bin.000001 &#124;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;335 &#124; dbname&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124;<br/>+------------------+----------+--------------+------------------+<br/><br/>================================================Slave設定<br/><br/>一樣找到my.cnf中加入<br/><br/>server-id = 2 <br/>master-host = master ip<br/>master-user = username<br/>master-password = passwd<br/>master-port = port<br/>master-connect-retry = 多久同步一次<br/>replicate-do-db = 資料庫名稱<br/><br/>重啟mysql後檢查<br/><br/>mysql> show slave status<br/><br/>如果再last error的欄位有錯誤，一般是資料不同步導致主資料庫的某些語法無法在副資料庫執行。<br/><br/>因此如果很不幸的因為某些原因同步失敗了，解決的方式一種就是重新mysqldump主資料庫的資料倒到副資料庫在重啟同步機制<br/><br/>另一種則是忽略此錯誤(最好用show slave status檢查無法執行的SQL語法，以及是否可以有稍微的主從不相同)<br/><br/>mysql>slave stop<br/>mysql>set global sql_slave_skip_counter =1<br/>mysql>start slave<br/><br/>若是狀態一直停留在<br/><br/>Waiting to reconnect after a failed master event read<br/><br/>表示這個使用者並沒有足夠的權限，解決方式在Master新增該使用者的權限即可<br/><br/>GRANT REPLICATION SLAVE ON dbname.* TO 'user'@'slavesDnsHostname' IDENTIFIED BY 'passwd'; <br/><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script><ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-1292700168892016" data-ad-slot="3191226934" data-ad-format="auto" data-full-width-responsive="true"></ins><script>(adsbygoogle = window.adsbygoogle &#124;&#124; []).push(&#123;&#125;);</script><br/>#===========20160714後記=====================<br/><br/>今天想要修改設定檔的時候，發現修改後不管怎麼restart<br/><br/>show slave status &#92;G;的結果都不變，(mysql 5.5版以後很像取消這種設定方式)<br/><br/>最後找到的解法是用client直接改，修改設定檔似乎沒有用，語法如下<br/><br/>CHANGE MASTER TO MASTER_HOST='host ip', MASTER_PORT=3306, MASTER_USER='同步的帳號',&nbsp;&nbsp;MASTER_PASSWORD='密碼';<br/><br/>那如果碰到binlog出問題導致slave start一直出錯，可以嘗試<br/><br/>slave stop;<br/><br/>reset slave;<br/><br/>slave start;<br/>
]]>
</description>
</item><item>
<link>https://xdeath.tw/read.php?10</link>
<title><![CDATA[Mysql表格schema複製、資料複製、重新命名與暫存表格]]></title> 
<author>admin &lt;tszheng@twnic.net.tw&gt;</author>
<category><![CDATA[資料庫]]></category>
<pubDate>Tue, 22 Apr 2014 09:02:44 +0000</pubDate> 
<guid>https://xdeath.tw/read.php?10</guid> 
<description>
<![CDATA[ 
	複製一個新的表格schema與舊表格相同<br/><br/>create table new_table_name like old_table_name<br/><br/>將舊表格資料存入新表格<br/><br/>insert into new_table_name select * from old_table_name<br/><br/>重新命名表格<br/><br/>rename table `old_table_name` to new_table_name<br/><br/>開啟一個暫存用的table(僅有此次連線可以連)，某些情況下配合表格的複製挺好用<br/><br/>create temporary table tmp_name
]]>
</description>
</item>
</channel>
</rss>