mac升級XAMPP 7.1.4之後無法啟動MySQL的解決辦法
>> 2017年7月2日 星期日
(補充說明:這個問題多出現在升級到MariaDB 5.6之後出現)
看到這種狀況,下意識感覺不妙。
於是進入終端機(command)模式,想說用指令啟動看看。看到了錯誤訊息。
閱讀錯誤訊息(檔案位置:/Applications/XAMPP/xamppfiles/var/mysql/XXXXXXX-Pro.local.err,XXXXXXX為你的電腦名稱)的最後幾行找到了問題所在。
錯誤訊息如下,如果你發現與我有相同(類似)的訊息,那這篇就是你可以參考的解決方式了:
2017-06-30 20:54:19 140736512222144 [ERROR] InnoDB: Attempted to open a previously opened tablespace. Previous tablespace mysql/gtid_slave_pos uses space ID: 3 at filepath: ./mysql/gtid_slave_pos.ibd. Cannot open tablespace mysql/slave_relay_log_info which uses space ID: 3 at filepath: ./mysql/slave_relay_log_info.ibdRead more...
2017-06-30 20:54:19 7fffc5d163c0 InnoDB: Operating system error number 2 in a file operation.
InnoDB: The error means the system cannot find the path specified.
InnoDB: If you are installing InnoDB, remember that you must create
InnoDB: directories yourself, InnoDB does not create them.
InnoDB: Error: could not open single-table tablespace file ./mysql/slave_relay_log_info.ibd
InnoDB: We do not continue the crash recovery, because the table may become
InnoDB: corrupt if we cannot apply the log records in the InnoDB log to it.
InnoDB: To fix the problem and start mysqld:
InnoDB: 1) If there is a permission problem in the file and mysqld cannot
InnoDB: open the file, you should modify the permissions.
InnoDB: 2) If the table is not needed, or you can restore it from a backup,
InnoDB: then you can remove the .ibd file, and InnoDB will do a normal
InnoDB: crash recovery and ignore that table.
InnoDB: 3) If the file system or the disk is broken, and you cannot remove
InnoDB: the .ibd file, you can set innodb_force_recovery > 0 in my.cnf
InnoDB: and force InnoDB to continue crash recovery here.
170630 20:54:19 [ERROR] mysqld got signal 6 ;
This could be because you hit a bug. It is also possible that this binary
or one of the libraries it was linked against is corrupt, improperly built,or misconfigured. This error can also be caused by malfunctioning hardware.
php判斷式的簡化
>> 2012年1月5日 星期四
一般而言,二元判斷是的寫法會是:
if($aa="y"){
echo "YES";
}else{
echo "NO";
}
有更簡便的寫法,一行解決:
echo ($aa="y")? "YES" : "NO" ;
?>
同理,取得GET變數或POST變數也可以用下列方式一行解決
if(empty($_GET['time'])){
$time = time();
}else{
$time = $_GET['time'];
}
echo $time;
//如果GET有time這個值則帶入變數time,如果沒有就給予現在time()的時間
//簡化寫法如下:
$time = ( empty($_GET['time']) ) ? (time()) : ($_GET['time']);
?>
另外,如果是一元判斷,則可以更簡潔處理,如:
$flag = true;Read more...
if($flag){
goFunction();
}
//以上可以簡化成下面這行
$flag && goFunction();
?>
FreeBSD中的mysql安裝
>> 2011年12月13日 星期二
網路上以FreeBSD+MySQL搜尋,可以找到上百篇的安裝說明,
大致上的過程,不外乎就是:進入ports目錄,make、make install,
有的寫得比較詳盡一點的,會在make的時候加上一個WITH_CHARSET=utf8 或BUILD_OPTIMIZED=yes 或WITH_XCHARSET=all 這三個參數,
這幾個參數即使不加,也不會有太大的影響,還可以從設定檔裡面進行調整。
install之後,就是在/etc/rc.conf中加入mysql_enable="yes"
最後就可以用/usr/local/etc/rc.d/mysql-server start進行啟動,這樣大致上就完成了。
有的安裝文會在後面加上「cp /usr/local/share/mysql/my-medium.cnf /etc/my.cnf」
這是如果有一些設定要自訂的話,就需要加這個檔案調整。
常見的調整有:
query_cache_size = 32M ==>調整快取記憶體
[mysqld]
default-character-set=utf8 ==>預設編碼
[client]
default-character-set=utf8 ==>clinet預設編碼
大致上,不明究理的,跟著作,啟動都沒有太大問題,幾乎都會成功。
但是,天將降大認於斯人也,我就偏偏一直無法啟動,而且連個錯誤訊息都沒有。
幸好有雄大師會診,才發現之前發現的問題與嘗試的解決,都擦身而過。
好吧~把這一次的嘗試,對於mysql的相關運作,將所理解的寫在這邊紀錄一下吧!
有關於my.cnf的設定檔
1.可以不用複製與設定,當/etc或/usr/local/etc中沒有這個設定檔案時,系統會以預設的方式執行(例如編碼如果在make時有指定,則就會將指定編碼變成預設)
2.設定檔放在/etc或/usr/local/etc都可以。不過如果好習慣,應該要放在/usr/local/etc裡面。
3.這個設定檔只要有variable設定錯誤,就無法順利執行。
結論:若無特殊需求(如:需要加大快取記憶體)就不要複製、設定這個檔案了。
有關於錯誤訊息
一般系統錯誤訊息會從/var/log裡面去看,而mysql的錯誤訊息會紀錄在/var/db/mysql/server.domain.com.err裡面,其中server.domain.com會呈現你的hostname。
上面所說得設定檔若有錯誤,造成無法啟動,也可以在這個檔案中找到訊息。
有關於剛剛安裝後的初始處理
一般而言,剛剛安裝完以後,執行 /usr/local/etc/rc.d/mysql-server start 指令,系統就會自動進行資料庫初始化工作。
最原始的系統,會自動產生兩個資料庫:mysql、test。
並且,會產稱一個/var/db/mysql/server.domain.com.pid檔案。
不過,如果細心一點,會發現,當剛剛make install結束之後,會提醒你執行/usr/local/bin/mysql_install_db,進行資料庫初始化。
解析一下這個 mysql_install_db做了哪些事情。
mysql_install_db其實是一個shell script,會引用 my_print_defaults在執行的路徑底下產生一個data資料夾。裡面放的,就是預設會用的資料庫檔案。
不過,如果直接執行/usr/local/bin/mysql_install_db會出現下列的錯誤訊息:
FATAL ERROR: Could not find ./bin/my_print_defaults原因在於,這個shell中 basedir變數預設空白,所以需要在指令後面加上 --basedir 參數,指定程式的位置,要正常執行會是下面的樣子:
/usr/local/bin/mysql_install_db --basedir=/usr/local(/usr/local後面不要加/,不然路徑會變成/usr/local//bin...,是沒有影響啦!)
正常的執行之後,還會有一段的提醒文字,提醒你執行之後要去修改密碼。
這時候,在你執行這個指令的根目錄會產生一個data資料夾,裡面有預設需要用到的檔案。
此時,當你執行 /usr/local/etc/rc.d/mysql-server start,系統便會去複製這個資料夾的檔案到var/db/mysql裡面。
這就是整個資料庫的初始化過程囉!
最後,可以用ps ax | grep mysql指令看看是否有正常執行。
還有,記得要
/usr/local/bin/mysqladmin -u root password 'new-password'
/usr/local/bin/mysqladmin -u root -h server.domain.com password 'new-password'
這兩個指令,指定資料庫密碼喔! Read more...
在FreeBSD中透過ssh上傳檔案
>> 2011年11月16日 星期三
linux-like系統中,若是使用ssh連線,可以透過scp的方式,將檔案直接上傳到主機端,相當方便。
可是,FreeBSD預設的安裝中,並沒有支援這樣的功能。(目前還在確認中!據說啟用sshd就可以使用了,可是我的就是不行。)(CentOS中預設就有這樣功能支援)
這時候需要手動進行安裝,才能使用。
首先,我們需要下載所需套件,因為我已經安裝好wget這個程式,所以直接已指令:
# wget http://freeware.sgi.com/source/rzsz/rzsz-3.48.tar.gz
進行下載即可。
(附註:經search ports,其中是有 lrzsz-0.12.20_3的套件可以使用,不過我在 fetch 時,卻無法順利抓到原始檔,導致安裝失敗。 )
接下來解壓縮:
# tar -xzvf rzsz-3.48.tar.gz
# cd src
# vi Makefile
修改 Makefile中的 OFLAG= -O 變為:OFLAG= -O -DREGISTERED
(用意在於,避免之後上傳、下載完成後,都會跳出提示。)
# make posix
cc -O2 -pipe -O -DREGISTERED -DPOSIX -DMD=2 rz.c -o rz
size rz
text data bss dec hex filename
29201 640 6328 36169 8d49 rz
rm -f rb rx rc
ln rz rb
ln rz rx
ln rz rc
cc -O2 -pipe -O -DREGISTERED -DPOSIX sz.c -o sz
size sz
text data bss dec hex filename
34740 704 38828 74272 12220 sz
rm -f sb sx zcommand zcommandi
ln sz sb
ln sz sx
ln sz zcommand
ln sz zcommandi
到這邊,如果沒有出現錯誤訊息,那幾乎已經完成安裝,
接下來只要把sz與rz兩個執行檔複製到 /usr/sbin/ 或 /usr/local/bin 即可。
# cp rz sz /usr/sbin/
# cp rz sz /usr/local/bin
可能出現的問題解決方案:
- 使用時如果遇到以下的錯誤:
-->則以root的身份,修改/dev/pts/5的權限即可。-bash-3.00$ sz sz.doc
/dev/pts/5: Permission denied
- 編譯時出現 cc 找不到的訊息:
- 編譯出現 size 找不到 的訊息:
FreeBSD中ports的安裝相關指令
- ports檔案的放置位置:/usr/ports
- 每個目錄中包含的檔案:
- Makefile :安裝軟體的編譯設定,編譯、安裝軟體時的參數可以在這邊修改。
- distinfo :安裝說明檔,說明安裝時所需要的檔案以及MD5的檢查資料。
- files:是個目錄,裡面放著程式的原始碼。
- pkg-descr :軟體的詳細描述。
- pkg-plist :軟體安裝的清單,以及安裝之後的檔案放置位置。
- 尋找想要安裝軟體的目錄:
- # cd /usr/ports
- # make search key='關鍵字'
- 安裝指令:
- # make install :進行編譯、安裝動作
- # make clean :清除編譯過城中產生的檔案
- # make deinstall :移除已經安裝的軟體(重要:執行這個指令,一定要在該軟體的目錄中執行喔!如果在/usr/ports中執行這個指令,則會將所有安裝的軟體統統移除喔!)
- # make reinstall :重新安裝之前安裝過程中斷的程式。
- # make cinfigure :重新進行組態,但不繼續編譯。
- # make all install :抓回原始檔案、編譯、安裝。
- # make fetch :抓回所需要的原始檔。
- # make fetch-list :顯示安裝所需要的檔案。
- # make checksum :抓回原始檔案並且使用md5檢查正確性。
- # male extract:抓回原始檔,並且將他解開。
- # make package :將做好的porst打包製作成packages。
- 更新ports tree 的方法:
判斷NFS是否連線的sh
>> 2011年11月8日 星期二
NFS用在資料的備份是相當的方便,但是隱藏著一個危機:
當server端沒有開啟或是無法順利掛載時,
若是將NFS掛載寫在/etc/fstab中,則會造成無法順利開機。
若是將NFS掛載寫在備份執行的shell中,
則會讓備份檔案備份在本機,(NFS需要掛載在本機的一個目錄中)
這樣的結果,輕則造成硬碟空間被佔據,嚴重的話,則會因為分割區爆滿而整台server掛點。
避免這樣的問題其實很簡單,加個幾行的判斷式,就可以避免這樣的危機。
這個判斷式的原理很簡單,我用df加上管線指令去判斷目前的磁碟中是否存在指定的主機所掛載的磁碟。如果有,就繼續進行其他的動作,如果沒有,則終止整個sh,並傳出一個錯誤代碼1。
我把這一段判斷式寫成一個sh檔案,判斷完成後的剩餘工作,就由使用者自行去填寫囉!
因應linux與FreeBSD所使用的shell不一樣,在一開使的使用shell宣告上有些許不同,因此我針對不同的OS,寫了不同的sh,其實,差異只在於一開始的宣告而已。
test NFS link:
#!/bin/bashsh檔案for LINUX:下載
# Program:
# This program for test is nfs link?
# History:
# 2011/11/06 Yixin Chen(cat) 0.1 release
# 2011/11/07 Yixin Chen(cat) 0.1.1 release
# 2011/11/08 Yixin Chen(cat) 0.1.2 release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
# setting var
nfsip="172.17.1.241"
# -----------------------
flag=$(df |grep ${nfsip})
if [ "$flag" == "" ]; then
echo "NFS is NOT link!"
exit 1
fi
echo "NFS is link!"
# other active ....
exit
sh檔案for FreeBSD:下載
其他有關於NFS的掛載資訊,請參閱:
雄的 FreeBSD 筆記‧NFS (Network File System)
鳥哥的 Linux 私房菜第十三章、檔案伺服器之一:NFS 伺服器 Read more...