說實話,第一次接觸這類
測試,剛開始有些摸不到頭腦,確切的說是摸不到重點,無論是測試還是TC,都讓我很頭疼,后來慢慢的,我就領悟到了這類測試的方法以及技巧,后來覺得真的很簡單,并不像當初想的那么不容易。
首先明確哪些是需要測試的API
研發(fā)的代碼中可能實現(xiàn)了很多API,首先必須明確哪些需要測,哪些不必要測;哪些整個迭代不測,下一個迭代再測;有一些接口是可能就直接調用另外一個接口,這些接口有沒有必要測等。這些沒有確定清楚直接導致漏測或者做無用功。
明確每個API實現(xiàn)的功能和設計TC
在確定了哪些接口需要測試之后,就必須明確每個接口實現(xiàn)的功能以及接口的參數(shù)、返回值的意義等。理解這些接口參數(shù)的含義,這些參數(shù)僵尸設計TC的維度,簡單的說,這些參數(shù)可以看成一個一個輸入框,李四網(wǎng)頁手工測試一樣,將準備數(shù)據(jù)輸入即可。用黑盒的方法來為API設計TC和網(wǎng)頁手工測試很類似,無非就是把參數(shù)看成輸入框而已。但是
API測試在設計TC的時候還可以'偏白'一點,就是直接去看接口的實現(xiàn)的代碼,特別是一些異常情況的處理,一般程序在異常處理上總是相對于正常情況要脆弱一些,然后對前面用黑盒的方法設計好的TC進行一些補充。
值得注意的是,1)TC設計的時候盡量詳細,粒度盡量的小,測試代碼都是類似的,可能僅僅是傳入的參數(shù)不一樣,而測試校驗的
工作是計算機做的,所以一般情況下針對某個接口,10個TC和20個TC跑的花費是差不多的,但是測試粒度方面和代碼覆蓋率方面可能就增加了不少。2)TC也是要進行維護的,在測試執(zhí)行階段,如果發(fā)現(xiàn)需要補充TC,最好不要在現(xiàn)有的測試代碼上改,要新加代碼,同時在TC文檔中也同步更新。如果是TC的缺陷,才去修改對應的代碼,并在TC文檔中做更新。3)在設計TC文檔的時候,測試步驟的粒度最好能夠細到每一步需要調用哪個函數(shù)或接口,有點類似偽代碼的風格,這樣在寫代碼的時候就不用怎么思考,僅僅去實現(xiàn)它。
我們做這類測試,是直接拿應用程序在本地開啟service,首先你在啟動service之前,要配置好
web.config文件,這個很重要,包括你測試所需要的
數(shù)據(jù)庫名字以及相應API測試所需要的特殊配置。我們這里主要配置和外部有交互的一些service地址,以及一些數(shù)字電視產品的ID等信息。
API測試除了要測試功能以外還要測試接口。一個API或者函數(shù)可以作為一個單元,對這個單元進行
單元測試,可以用黑盒也可以用白盒方法。黑盒方法就是不去看這個單元的實現(xiàn)代碼,只根據(jù)中廣核單元的功能說明來設計
測試用例并進行測試。測試的時候可能需要寫一些簡單的代碼來做數(shù)據(jù)準備,然胡去調用需要測試的接口,一般也需要寫一些代碼來接受或者驗證被測單元的輸出是否正確;
白盒測試方法就是同構分心被測單元的實現(xiàn)代碼,根據(jù)不同的測試策略來設計測試用例并作相應的測試。平臺產品的需求很多事來自網(wǎng)站,簡而言之,平臺產品提供API給網(wǎng)站研發(fā)使用。我們需要測的就是那些暴漏出來的API,確保這些API在功能上沒有缺陷。
我在做API測試的時候,主要采用的是
黑盒測試方法,用Fiddler工具去調接口,這個方便又明了,很容易看出被測單元的輸出是否正確。不過事先你需要明確的了解需求,以及整個系統(tǒng)的架構,需要了解都和哪些service有交互,都做哪些交互等。
當啟動chrome作selenium測試時,如果沒有設置driver,則會出錯.
driver下載地址https://code.google.com/p/chromedriver/downloads/list
三種方式
1.命令行中帶參數(shù)-Dwebdriver.chrome.driver
java -Dwebdriver.chrome.driver=chromedriver_win_22_0_1203_0b.exe org.junit.runner.JUnitCore seleniumtest_name
2.命令行中可以沒有-Dwebdriver.chrome.driver,但是需要在環(huán)境變量path中添加
chromedriver.exe(注意此處文件名只能是chromedriver.exe)的路徑.
例如chromedriver.exe的放在d:/中, 則把"d:/"添加到path變量中
此時命令簡化為:
java org.junit.runner.JUnitCore seleniumtest_name
3.可以在.java源文件中顯示設置chromedriver
System.setProperty("webdriver.chrome.driver","d:/chromedriver_win_22_0_1203_0b.exe")
RabbitMQ遠程調用
測試,使用外部機器192.168.174.132上的RabbitMQ,使用之前需要對遠程調用進行配置,操作過程見博文“解決RabbitMQ遠程不能訪問的問題”。
SendTest:
package com.mq.rabbitmq.rabbitmqtest; import com.rabbitmq.client.ConnectionFactory; import com.rabbitmq.client.Connection; import com.rabbitmq.client.Channel; import com.rabbitmq.client.QueueingConsumer; public class ReceiveTest { private final static String QUEUE_NAME = "ftpAgent"; private final static String userName = "admin"; private final static String password = "admin"; private final static String virtualHost = "/"; private final static int portNumber = 5672; private final static String hostName = "master"; private final static String host = "192.168.174.132"; public static void main(String[] argv) throws java.io.IOException, java.lang.InterruptedException { ConnectionFactory factory = new ConnectionFactory(); // factory.setHost("192.168.174.160"); factory.setUsername(userName); factory.setPassword(password); // factory.setVirtualHost(virtualHost); factory.setHost(host); factory.setPort(portNumber); Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); // channel.queueDeclare(QUEUE_NAME, false, false, false, null); System.out.println(" [*] Waiting for messages. To exit press CTRL+C"); QueueingConsumer consumer = new QueueingConsumer(channel); channel.basicConsume(QUEUE_NAME, true, consumer); Date nowTime = new Date(); while (true) { QueueingConsumer.Delivery delivery = consumer.nextDelivery(); String message = new String(delivery.getBody()); System.out.println("RecieveTime: " + nowTime); System.out.println(" [x] Received '" + message + "'"); } } } |
ReceiveTest:
package com.mq.rabbitmq.rabbitmqtest; import java.util.Date; import com.rabbitmq.client.ConnectionFactory; import com.rabbitmq.client.Connection; import com.rabbitmq.client.Channel; import com.rabbitmq.client.QueueingConsumer; public class ReceiveTest { private final static String QUEUE_NAME = "ftpAgent"; private final static String userName = "admin"; private final static String password = "admin"; private final static String virtualHost = "/"; private final static int portNumber = 5672; private final static String hostName = "master"; private final static String host = "192.168.174.132"; public static void main(String[] argv) throws java.io.IOException, java.lang.InterruptedException { ConnectionFactory factory = new ConnectionFactory(); // factory.setHost("192.168.174.160"); factory.setUsername(userName); factory.setPassword(password); // factory.setVirtualHost(virtualHost); factory.setHost(host); factory.setPort(portNumber); Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); // channel.queueDeclare(QUEUE_NAME, false, false, false, null); System.out.println(" [*] Waiting for messages. To exit press CTRL+C"); QueueingConsumer consumer = new QueueingConsumer(channel); channel.basicConsume(QUEUE_NAME, true, consumer); Date nowTime = new Date(); while (true) { QueueingConsumer.Delivery delivery = consumer.nextDelivery(); String message = new String(delivery.getBody()); System.out.println("RecieveTime: " + nowTime); System.out.println(" [x] Received '" + message + "'"); } } } |
運行結果:
SendTest:
磁盤IO是云主機的重要指標,可以按照負載情況分成照順序讀寫,隨機讀寫兩大類。
1、測試順序讀性能
fio --filename=/home/test -iodepth=64-ioengine=libaio--direct=1--rw=read--bs=1m--size=2g--numjobs=4--runtime=10 --group_reporting --name=test-read
2、測試順序寫性能
fio -filename=/home/test -iodepth=64-ioengine=libaio-direct=1-rw=write-bs=1m-size=2g-numjobs=4-runtime=20 -group_reporting -name=test-write
3、測試隨機讀性能
fio -filename=/home/test -iodepth=64-ioengine=libaio-direct=1-rw=randread-bs=4k-size=2G-numjobs=64-runtime=20 -group_reporting -name=test-rand-read
4、測試隨機寫性能
fio -filename=/home/test -iodepth=64-ioengine=libaio-direct=1-rw=randwrite-bs=4k-size=2G-numjobs=64-runtime=20 -group_reporting -name=test-rand-write
參數(shù)說明:
filename=/home/test 測試文件名稱,通常選擇需要測試的盤的data目錄。
direct=1 測試過程繞過機器自帶的buffer。使測試結果更真實。
rw=randwrite 測試隨機寫的I/O
rw=randrw 測試隨機寫和讀的I/O
bs=4k 單次io的塊文件大小為4k
size=2g 本次的測試文件大小為2g,以每次4k的io進行測試。
numjobs=64 本次的測試線程為64.
runtime=20 測試時間為20秒,如果不寫則一直將2g文件分4k每次寫完為止。
報告如何查看:
fio的結果報告內容豐富,我們主要關心的是兩項:
磁盤的吞吐量bw,這個是順序讀寫考察的重點
磁盤的每秒讀寫次數(shù)iops,這個是隨機讀寫考察的重點
比如,下面是4個測試的結果部分截取:
test-read: (groupid=0, jobs=4): err= 0: pid=4752
read : io=839680KB, bw=76823KB/s, iops=75 , runt= 10930msec
順序讀,帶寬76823KB/s,iops 75
test-write: (groupid=0, jobs=4): err= 0: pid=4758
write: io=899072KB, bw=42854KB/s, iops=41 , runt= 20980msec
順序寫,帶寬42854KB/s, iops=41
test-rand-read: (groupid=0, jobs=64): err= 0: pid=4619
read : io=72556KB, bw=3457.4KB/s, iops=864 , runt= 20986msec
隨機讀,帶寬3457.4KB/s, iops=864
test-rand-write: (groupid=0, jobs=64): err= 0: pid=4685
write: io=129264KB, bw=6432.4KB/s, iops=1608 , runt= 20097msec
隨機寫,帶寬6432.4KB/s, iops=1608。
使用
shell分析了一些數(shù)據(jù)有一些時間了,而且分析的數(shù)據(jù)情況也是基于歷史數(shù)據(jù),今天寫了個腳本對歷史的數(shù)據(jù)進行一個簡單的分析,看看準確率到底有多高。
這里有一個借助一個腳本12c.sh 對一些數(shù)據(jù)的排列百分比進行分析,比如今天有兩個球隊,主隊讓球一個,勝平負的概率為35%,40%,25%
表data里存放著一些樣本數(shù)據(jù),記錄了球隊的比賽情況。
sqlplus -s n1/n1 <<EOF set linesize 150 set pages 0 set feedback off spool check_$1.sh select 'ksh 12c.sh'||w||' '||t||' '||l||' '||rw||' '||rt||' '||rl||' ' from data where r=-1 and startdate='$1'; spool off; EOF ksh check_$1.sh |tee check_$1.log grep suggest check_$1.log |awk '{print $7" "$8" "$9" "$10" "$11" "$12" "$1" "$2" "$3" "$4" "$5" "$6}'>>filter_check.log cat filter_check.log function get_result { echo $1 sqlplus -s n1/n1 <<EOF set pages 0 select case when zhu>ke+1 then rpad('big win:',20)||to_number(w+rw)||' '||'$2'||','||'$3'||','||'$4'||','||'$5'||','||'$6'||','||'$7' when zhu=ke+1 then rpad('little win:',20)||to_number(w+rt)||' '||'$2'||','||'$3'||','||'$4'||','||'$5'||','||'$6'||','||'$7' when zhu=ke then rpad('tie:',20)||to_number(t+rl)||' '||'$2'||','||'$3'||','||'$4'||','||'$5'||','||'$6'||','||'$7' when zhu=ke-1 then rpad('little lose:',20)||to_number(l+rl)||' '||'$2'||','||'$3'||','||'$4'||','||'$5'||','||'$6'||','||'$7' when zhu<ke-1 then rpad('big lose:',20)||to_number(l+rl)||' '||'$2'||','||'$3'||','||'$4'||','||'$5'||','||'$6'||','||'$7' end end from data where startdate='$1' and w=$2 and t=$3 and l=$4 and rw=$5 and rt=$6 and rl=$7 order by (zhu-ke); EOF } while read line do echo ---start echo $line input_params=`echo $line|awk '{print $1" "$2" "$3" "$4" "$5" "$6}'` get_result $1 $input_params echo ....end echo . done <filter_check.log rm check_$1.log rm filter_check.log rm check_$1.sh |
分析結果如下,比如對前幾天的比賽情況進行分析,在我不知道比賽結果的前提下。
5場比賽猜中了3場,僅供娛樂。
---start
1.24 5.35 7.6 1.8 3.75 3.28 suggest w :82% of total 11
2014-08-26
little win: 4.99 1.24,5.35,7.6,1.8,3.75,3.28
....end
.
---start
1.18 5.85 9.4 1.65 3.9 3.75 suggest w :71% of total 17
2014-08-26
tie: 9.6 1.18,5.85,9.4,1.65,3.9,3.75
....end
.
---start
1.43 4.15 5.42 2.42 3.4 2.38 suggest w :65% of total 97
2014-08-26
little lose: 7.8 1.43,4.15,5.42,2.42,3.4,2.38
....end
.
---start
2.1 2.95 3.25 4.7 3.6 1.57 suggest rl :68% of total 50
2014-08-26
tie: 4.52 2.1,2.95,3.25,4.7,3.6,1.57
....end
.
---start
1.1 6.75 15 1.45 4.2 4.95 suggest w :80% of total 5
2014-08-26
big win: 2.55 1.1,6.75,15,1.45,4.2,4.95
....end
CLASSPATH是什么?它的作用是什么?
它是javac編譯器的一個環(huán)境變量。它的作用與import、package關鍵字有關。當你寫下improt
java.util.*時,編譯器面對import關鍵字時,就知道你要引入java.util這個package中的類;但是編譯器如何知道你把這個 package放在哪里了呢?所以你首先得告訴編譯器這個package的所在位置;如何告訴它呢?就是設置CLASSPATH啦 :) 如果java.util這個package在c:/jdk/ 目錄下,你得把c:/jdk/這個路徑設置到CLASSPATH中去!當編譯器面對import java.util.*這個語句時,它先會查找CLASSPATH所指定的目錄,并檢視子目錄java/util是否存在,然后找出名稱吻合的已編譯文件 (.class文件)。如果沒有找到就會報錯!CLASSPATH有點像c/c++編譯器中的INCLUDE路徑的設置哦,是不是?當c/c++編譯器遇 到include 這樣的語句,它是如何運作的?哦,其實道理都差不多!搜索INCLUDE路徑,檢視文件!當你自己開發(fā)一個package時,然后想要用這個 package中的類;自然,你也得把這個package所在的目錄設置到CLASSPATH中去!CLASSPATH的設定,對JAVA的初學者而言是 一件棘手的事。所以Sun讓JAVA2的JDK更聰明一些。你會發(fā)現(xiàn),在你安裝之后,即使完全沒有設定CLASSPATH,你仍然能夠編譯基本的JAVA 程序,并且加以執(zhí)行。 .....................................................................................................................................................
1. PATH環(huán)境變量。作用是指定命令搜索路徑, 在命令行下面執(zhí)行命令如javac編譯java程序時,它會到PATH變量所指定的路徑中查找看是否能找到相應的命令程序。我們需要把jdk安裝目錄下的 bin目錄增加到現(xiàn)有的PATH變量中,bin目錄中包含經常要用到的可執(zhí)行文件如javac/java/javadoc等待,設置好PATH變量后,就 可以在任何目錄下執(zhí)行javac/java等工具了。我們這里設定的PATH值為:
%SystemRoot%/system32;%SystemRoot%;%SystemRoot%/System32/Wbem;%SYSTEMROOT%/System32/WindowsPowerShell/v1.0/;C:/Program Files/Common Files/Thunder Network/KanKan/Codecs;C:/Program Files/Microsoft
SQL Server/90/Tools/binn/;C:/Program Files/Common Files/TTKN/Bin;C:/Program Files/Common Files/Teleca Shared;C:/Program Files/Java/jdk1.6.0_21/bin
上述只有紅色部分;C:/Program Files/Java/jdk1.6.0_21/bin是java的PATH變量,注意變量之間需要用";”隔開。
2. CLASSPATH環(huán)境變量。作用是指定類搜索路徑, 要使用已經編寫好的類,前提當然是能夠找到它們了,JVM就是通過CLASSPATH來尋找類的。我們需要把jdk安裝目錄下的lib子目錄中的 dt.jar和tools.jar設置到CLASSPATH中,當然,當前目錄“.”也必須加入到該變量中。這里CLASSPATH為:
.;C:/Program Files/Java/jdk1.6.0_21/lib/dt.jar;C:/Program Files/Java/jdk1.6.0_21/lib/tools.jar
3. JAVA_HOME環(huán)境變量。它指向jdk的安裝目錄,Eclipse/NetBeans/Tomcat等軟件就是通過搜索JAVA_HOME變量來找到并使用安裝好的jdk。這里JAVA_HOME為:
C:/Program Files/Java/jdk1.6.0_21
.....................................................................................................................................................
java環(huán)境變量配置步驟:
在
windows桌面上右擊“我的電腦” —> “屬性” —> “高級” —> “環(huán)境變量”,在“系統(tǒng)變量”里我們可以看到系統(tǒng)的各個環(huán)境變量的值。雙擊某個變量名可以修改變量值,變量值之間用“;”隔開。我們還可以“新建”原先沒 有的變量。與jdk有關的有3個環(huán)境變量;“JAVA_HOME”,“PATH”,“CLASSPATH”。我的系統(tǒng)中“PATH”變量已經存在,可以直 接添加新值(其它變量值不要動,防止其它程序運行異常),其它兩個變量需要新建。
CLASSPATH= .;%JAVA_HOME%/lib/dt.jar;%JAVA_HOME%/lib/tools.jar
JAVA_HOME = C:/Program Files/Java/jdk1.5.0
PATH = %JAVA_HOME%/bin;%JAVA_HOME%/jre/bin
從上面我們可以看出,PATH和CLASSPATH都使用到了JAVA_HOME,也可以使用絕對路徑,兩者皆可。
Tomcat環(huán)境變量配置:
系統(tǒng)變量中新建
BASEDIR,路徑為:Tomcat根目錄,如D:\Tomcat
其它與java jdk相關的引用路徑可以查看文件bin\setclasspath.bat
注意,java環(huán)境變量配置JAVA_HOME主要為了其它容器調用,JAVA_HOME的java jdk路徑后邊不帶“;” 即不可分號結束。
.....................................................................................................................................................
Tomcat\bin中setclasspath.bat文件 rem --------------------------------------------------------------------------- rem Set CLASSPATH and Java options rem rem $Id: setclasspath.bat,v 1.6.2.1 2004/08/21 15:49:50 yoavs Exp $ rem --------------------------------------------------------------------------- rem Make sure prerequisite environment variables are set if not "%JAVA_HOME%" == "" goto gotJavaHome echo The JAVA_HOME environment variable is not defined echo This environment variable is needed to run this program goto exit :gotJavaHome if not exist "%JAVA_HOME%\bin\java.exe" goto noJavaHome if not exist "%JAVA_HOME%\bin\javaw.exe" goto noJavaHome if not exist "%JAVA_HOME%\bin\jdb.exe" goto noJavaHome if not exist "%JAVA_HOME%\bin\javac.exe" goto noJavaHome goto okJavaHome :noJavaHome echo The JAVA_HOME environment variable is not defined correctly echo This environment variable is needed to run this program echo NB: JAVA_HOME should point to a JDK not a JRE goto exit :okJavaHome if not "%BASEDIR%" == "" goto gotBasedir echo The BASEDIR environment variable is not defined echo This environment variable is needed to run this program goto exit :gotBasedir if exist "%BASEDIR%\bin\setclasspath.bat" goto okBasedir echo The BASEDIR environment variable is not defined correctly echo This environment variable is needed to run this program goto exit :okBasedir rem Set the default -Djava.endorsed.dirs argument set JAVA_ENDORSED_DIRS=%BASEDIR%\common\endorsed rem Set standard CLASSPATH rem Note that there are no quotes as we do not want to introduce random rem quotes into the CLASSPATH set CLASSPATH=%JAVA_HOME%\lib\tools.jar rem Set standard command for invoking Java. rem Note that NT requires a window name argument when using start. rem Also note the quoting as JAVA_HOME may contain spaces. set _RUNJAVA="%JAVA_HOME%\bin\java" set _RUNJAVAW="%JAVA_HOME%\bin\javaw" set _RUNJDB="%JAVA_HOME%\bin\jdb" set _RUNJAVAC="%JAVA_HOME%\bin\javac" goto end :exit exit /b 1 :end |
前言:mysql參數(shù)的修改在mysql的課程里面應該屬于相對基礎的知識,但是作為一個mysql的初學者還是很有必要弄懂這個知識點,以后的
學習過程中將會經常用到的。技術很多時候都是相通的,如果有學過oracle的朋友應該會知道,oracle的參數(shù)里面有幾個標簽:動態(tài)參數(shù)、靜態(tài)參數(shù)、session級別修改、全局修改、立即生效和延遲生效。作為數(shù)據(jù)庫mysql也同樣有這些特性,但是整體學起來后會發(fā)現(xiàn)mysql某些方面還是沒有oracle做的到位,在該文檔的最后咱們再做個總結。
一、參數(shù)文件
1、查看參數(shù)文件
通過命令行"mysql --help | grep my.cnf"查看my.cnf文件的位置,linux操作系統(tǒng)中參數(shù)文件默認為/etc/my.cnf,按照mysql官方文檔的說明,mysql的啟動參數(shù)文件的順序如下:
1、查找根據(jù)順序查找全局 /etc/my.cnf /etc/mysql/my.cnf /SYSCONFDIR/my.cnf為全局選項
2、$MYSQL_HOME/my.cnf為服務指定變量
二、參數(shù)文件的修改
1、動態(tài)參數(shù)和靜態(tài)參數(shù)的概念
Mysql 的參數(shù)類型:分為動態(tài)(dynamic)和靜態(tài)參數(shù)(static);
動態(tài)參數(shù)意味著可以再mysql實例運行中進行更改;
靜態(tài)參數(shù)說明在整個實例聲明周期內都不得進行更改,就好像是只讀的。
在動態(tài)參數(shù)中,有些參數(shù)修改可以是基于回話的也可以是基于整個實例的生命周期。
2、全局變量與會話變量
全局變量在MYSQL啟動的時候由服務器自動將它們初始化為默認值。會話變量在每次建立一個新的連接的時候,由MYSQL來初始化。MYSQL會將當前所有全局變量的值復制一份。來做為會話變量。(也就是說,如果在建立會話以后,沒有手動更改過會話變量與全局變量的值,那所有這些變量的值都是一樣的。全局變量與會話變量的區(qū)別就在于,對全局變量的修改會影響到整個服務器,但是對會話變量的修改,只會影響到當前的會話(也就是當前的
數(shù)據(jù)庫連接)
3、參數(shù)的查看方式
Mysql的參數(shù)可以通過"show variables"來查看,由于從mysql5.1版本開始,可以通過information_schema架構下的GLOBAL_VARIABLES視圖來進行查找,所以也可以這樣查看"select * from information_schema.global_variables";
查看參數(shù)的腳本:
語句一、
mysql> SHOW VARIABLES LIKE 'max_join_size';
mysql> SHOW GLOBAL VARIABLES LIKE 'max_join_size';
語句二、
mysql> select * from information_schema.global_variables; +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+ | VARIABLE_NAME | VARIABLE_VALUE | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+ | MAX_PREPARED_STMT_COUNT | 16382 | | INNODB_BUFFER_POOL_SIZE | 134217728 | | HAVE_CRYPT | YES | | PERFORMANCE_SCHEMA_EVENTS_WAITS_HISTORY_LONG_SIZE | 10000 | | INNODB_VERSION | 5.5.36 | | QUERY_PREALLOC_SIZE | 8192 | | DELAYED_QUEUE_SIZE | 1000 | | PERFORMANCE_SCHEMA_MAX_COND_INSTANCES | 1000 | | SSL_CIPHER | | | COLLATION_SERVER | utf8_general_ci | | SECURE_FILE_PRIV | | | TIMED_MUTEXES | OFF | | DELAYED_INSERT_TIMEOUT | 300 | | PERFORMANCE_SCHEMA_MAX_MUTEX_INSTANCES | 1000000 | | LC_TIME_NAMES | en_US |
4、參數(shù)的修改,參數(shù)的修改有以下幾種方法,作為學習、便于理解其中的原理所在,這里把幾種方法都整理出來了,歡迎各位的查看
方法一、修改參數(shù)文件。所有的參數(shù)都保存在/etc/my.cnf文件中,所以直接修改該參數(shù)文件便可修改相應的系統(tǒng)參數(shù)。
弊端:修改該參數(shù)需要重啟后才能生效,當系統(tǒng)上線后一般都不能隨便重啟,所以該方法很少用;
操作方法:
1、修改參數(shù)文件/etc/my.cnf,添加general_log_file = /data/mysql/mysql_2.logvi /etc/my.cnf
# The MySQL server [mysqld] port = 3306 socket = /tmp/mysql.sock skip-external-locking key_buffer_size = 384M max_allowed_packet = 1M table_open_cache = 512 sort_buffer_size = 2M read_buffer_size = 2M read_rnd_buffer_size = 8M myisam_sort_buffer_size = 64M thread_cache_size = 8 query_cache_size = 32M # Try number of CPU's*2 for thread_concurrency thread_concurrency = 8 general_log_file = /data/mysql/mysql_2.log |
2、重啟mysql服務
service mysqld stop
3、檢查參數(shù)是否生效
mysql> show variables like 'general%';
+------------------+-------------------------+
| Variable_name | Value |
+------------------+-------------------------+
| general_log | OFF |
| general_log_file | /data/mysql/mysql_2.log |
+------------------+-------------------------+
2 rows in set (0.00 sec)
當前顯示已生效
方法二、如果是動態(tài)參數(shù)的話,便可以直接通過語句修改。
(http://dev.mysql.com/doc/refman/5.6/en/dynamic-system-variables.html mysql的所有參數(shù)詳情介紹
sql語法:
SET variable_assignment [, variable_assignment] ... //可以同時修改多個參數(shù)
variable_assignment:
user_var_name = expr
| [GLOBAL | SESSION] system_var_name = expr
| @@[global. | session.]system_var_name = expr
例子:
SET sort_buffer_size=10000; /修改SESSION參數(shù)
SET @@local.sort_buffer_size=10000; /修改全局參數(shù)
SET GLOBAL sort_buffer_size=1000000, SESSION sort_buffer_size=1000000; /同時修改多個SESSION參數(shù)
SET @@sort_buffer_size=1000000; /第二種修改全局參數(shù)的方法
SET @@global.sort_buffer_size=1000000, @@local.sort_buffer_size=1000000;
說明如下:
1)修改SESSION的參數(shù)的影響:如果您使用SESSION(默認情況)設置一個系統(tǒng)變量,則該值仍然有效,直到當前會話結束為止,或者直到您把變量設置為一個不同的值為止。
2)如果您使用GLOBAL(要求SUPER權限)來設置一個系統(tǒng)變量,則該值被記住,并被用于新的連接,直到服務器重新啟動為止。
如果您想要進行永久式變量設置,需要寫入到參數(shù)文件。(通過SET命令并不會修改參數(shù)文件的內容,還需要另行修改,這點做的沒有ORACLE好)
3)為了防止不正確的使用,如果您使用SET GLOBAL時同時使用了一個只能與SET SESSION同時使用的變量,或者如果您在設置一個全局變量時未指定GLOBAL(或@@),則MySQL會產生一個錯誤。( SET GLOBAL命令修改SESSION參數(shù)的時候會報錯)
4)如果您想要把一個SESSION變量設置為GLOBAL值或把一個GLOBAL值設置為內部MySQL默認值,需使用DEFAULT關鍵詞。例如,在把max_join_size會話值設置為全局值時,以下兩個語句是一樣的:SET max_join_size=DEFAULT;(恢復成默認值的設置)
總結:1、mysql的參數(shù)設置相對oracle來說較為簡單。
2、針對參數(shù)設置的方法本身沒有太多經驗,作為一個DBA不管是修改oracle參數(shù)、或mysql參數(shù),建議每個數(shù)據(jù)庫都有一個文檔用于記錄參數(shù)修改的歷史,這樣哪臺出現(xiàn)了問題,便于跟蹤;
根據(jù)IEEE 828和CMM/CMMI,
配置管理計劃常常被認為是一份文檔,確實的,對于一個大項目而言,往往需要制定項目自身的配置管理計劃。
但不是所有的組織都是軟件外包組織,不是每個項目針對的是不同的客戶。
首先是組織層面,一般,提供統(tǒng)一的配置管理服務,不會允許每個團隊自己搭建配置管理服務器。所以對于組織級的配置管理服務要有所約定,約定的主要內容有:
如何建立項目文檔目錄?
如何建立產品級目錄?
如何建立代碼目錄?
配置項如何命名?
配置庫的備份和恢復如何進行?誰來進行?
什么情況下拉分支?什么情況下合并到主干? 關于分支主干要提供多種模式,或者放開限制,讓產品線或者項目組選擇。
如何進行變更? 一般應當在組織級進行定義和發(fā)布。如果放到項目層面,變更流程的制定太費功夫;當然有些大項目是有足夠的預算和特殊情況需要專門定義項目級的變更。
對產品線和項目如何開展配置審計?
有什么推薦的配置管理實踐?
組織級配置管理規(guī)程或者指南的更新頻率在每年一次左右。
其次是產品線層面。對于特定產品線,已經存在大量的源代碼和文檔,那么結合實際,這個產品線在配置管理存儲時有哪些約定?
比如對代碼配置項和非配置項有所說明,不要假設每個團隊新人都是代碼配置管理達人,小心自以為是的新手加入一些自以為是的垃圾。雖然可以刪除,但發(fā)現(xiàn)再刪除,其本身就是成本。
比如哪些依賴項值得存儲?
比如哪些區(qū)域是機密,權限另外管理
比如那些代碼是核心代碼,如果改動需要資深人員復核。
本產品線的主干和分支策略是什么? 守護主干?還是先鋒主干?無分支?還是單分支?還是多分支?
比如約定團隊統(tǒng)一一致的
工作環(huán)境:都把
Java裝在C:/java,把eclipse裝在D:/eclipse
最后是項目層面。在有了上述組織級和產品線級的配置管理約定后,項目層面的配置管理計劃中最關鍵的是需要明確人員、基線和項目特殊配置項。其中基線的安排必須與項目本身生命周期的選擇相匹配,最重要而言,必須匹配于里程碑。
在這樣的三層結構下,為項目高效計,不需要單獨寫項目的配置管理計劃,只需把項目級的配置管理約定寫入項目計劃即可,一般的篇幅不超過1頁。
項目所處的階段越早,項目不確定性就越大,項目調整或變更的可能性就越大,同時帶來的代價比較低。但隨著項目的進行,不確定性逐漸減小,而變更的代價、付出的人力、資源逐漸增加,就會增加決策的困難度。
一旦項目變更發(fā)生了,項目經理該怎么處理呢?
1.記錄變更請求(CR): 任何變更,不論以后是否會被接受,都應該首先記錄下來,有些變更請求也許在本階段不被接受,也許可以成為以后參考的功能或范圍。所以對于任何變更請求,首先要做的是記錄下來是一個什么樣的變更請求,是由哪一類項目干系人提出來的,以及相應的聯(lián)系方式。
2.澄清變更細節(jié),分析相應變更請求的必要性。
3.對變更請求產生的原因進行分析,像是由于在項目初期對需求沒有明確產生的項目變更,或是沒有明確項目范圍產生的變更,還是由于外部事件產生的變更。
4.根據(jù)變更請求,分析變更對現(xiàn)有項目進度的影響程度,及變更之間的依賴關系。
5.根據(jù)變更請求對現(xiàn)有項目進度的影響程度,確認相應的成本估計。
6.對項目變更排列優(yōu)先級。
7.同項目贊助人協(xié)商項目變更影響,解決變更請求需要符合的條件以及相應的費用,并達到項目贊助人的可接受程度。最終確定是否實施變更。
8.項目配置控制委員會批準相應的項目范圍變更,進度計劃,人員和費用計劃。
9.將變更加入詳細計劃,更新相應文檔,通知相應項目干系人(變更的內容、進度、人員、費用)。
10.執(zhí)行并提交項目變更。
11.在項目變更被接受后,終止變更請求。
12.記錄實際項目變更所帶來的影響,汲取教訓。
背景:已經使用Jira和
Confluence管理了一個產品團隊的任務和資源,現(xiàn)在又想加入另外一個產品團隊的任務和資源,首要問題是如何解決兩個團隊之間的權限隔離。研究了半天,閱讀了Jira和confluence的相關文檔,終于搞定,現(xiàn)在分享給大家。
Jira
打開系統(tǒng)管理中的權限模型我們可以看到現(xiàn)在有系統(tǒng)默認的權限模型和我自定義的兩個權限模型(建議自建權限模型時采用復制默認模型的方法然后進行更改)
我們打開系統(tǒng)的默認權限模型可以看到系統(tǒng)默認的三種用戶組(管理員,開發(fā)者,普通用戶)
我們可以打開tester的權限模型然后對相應權限應用的用戶組進行更改
這些組和組成員的管理在用戶、組及角色中進行設置
3.我們再把項目的權限模型改為需要的權限模型即可
Confluence
Confluence不同產品團隊間的資源權限可以利用“空間”的方式來做隔離,如下所示
創(chuàng)建一個空間,標紅的地方本來是默認選中的,我們不選它們,以便之后的隔離權限。
創(chuàng)建空間后管理員可以進入相應空間的空間管理界面進行權限設置,比如這里除管理員外我只給ibaby組用戶分配關于此產品空間的權限。
這些組和組成員在站點管理的管理用戶中設置即可。
這樣當某個用戶登錄后只會看到自己所屬組擁有權限的空間。
一點小感想:我個人感覺Jira和Confluence不僅功能完善、流程清晰、易用性也好;更重要的是它的主旨是鼓勵團隊間的協(xié)作,千萬不要把它作為一個監(jiān)控員工工作的工具。現(xiàn)在很多公司還在繼續(xù)采用限制監(jiān)管員工的管理方式,采用這種自上而下的監(jiān)管,不如接受自下而上的協(xié)作去推動工作。