問題描述和思路mysql
下午作svn鉤子文檔時,開發大哥跑來,說mysql啓動報錯,半個小時沒找到解決的辦法,報錯內容爲:StartingMySQL. ERROR! The server quit without updating PID file!c++
根據大哥的描述,立刻想到多是mysql高速運行下,作大量數據查詢時候,卡的時候,強制殺掉mysql數據庫,因爲主主模式不是很熟悉,判斷是兩邊數據寫入不同,致使起不來,立刻想到單個服務器啓動,進入127服務器,打開my.cnf文件,server-id註銷,啓動仍是報錯,查看日誌,也是提示找不到pid文件,進入相關目錄/var/run/mysqld/mysqld.pid
,發現根本沒有,在數據庫配置文件中指定mysql.pid文件仍是報錯,可能大體分析出強制殺掉進程致使數據結構出現問題,
mysqld_safe --user=mysql &安全模式進入,可是仍是報錯,因爲不熟悉公司總體架構,這時已經有點絕望,大哥過來講先找到備份問題,而後考慮從新初始化,可是mysql是yum安裝,沒有install_db初始化命令。這時候,沈哥找到了備份數據,上月的全備,根據相應的腳本也找到相應的增量備份。sql
問題過後回顧數據庫
啓動mysql服務時出現以下錯誤,可查看錯誤日誌找出錯誤緣由。bootstrap
Error:Starting MySQL.The server quitwithout updating PID file (/data/mysql/failed184_sles10.pid).安全
Error:服務器
13073010:15:37 [ERROR] COLLATION 'utf8_general_ci' is not valid for CHARACTER SET'latin1'數據結構
13073010:15:37 [ERROR] Aborting架構
若錯誤日誌中出現如上錯誤,則是在編譯的時候字符集與校對集沒有對應。校對集時utf8_general_ci,而字符集是latin1。app
解決方法:在配置文件my.cnf 中的[mysqld]下面加上 -DDEFAULT_CHARSET=utf8;-DDEFAULT_COLLATION=utf8_general_ci 這兩條語句。「utf8」和「utf8_general_ci 」可改爲相應的字符集合校對集。修改完後看可否啓動成功,如果出現一樣的問題,那沒辦法只能從頭編譯再裝了。
Error:
13073014:46:20 [ERROR] Plugin 'InnoDB' init function returned error.
13073014:46:20 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
13073014:46:20 [ERROR] Unknown/unsupported storage engine: InnoDB
13073014:46:20 [ERROR] Aborting
出現如上錯誤多是innodb在啓動時出了問題。
解決方法:在配置文件裏面寫上 [mysqld]skip-innodb 或者在data目錄下將文件ib_logfile0、ib_logfile1刪除便可
CMake Error: The source directory"/data/cheriegong" does not appear to contain CMakeLists.txt.
若編譯時出現以上錯誤,須要把預編譯裏面的MYSQL_USER去掉,便可預編譯成功!
mysql編譯準備
綜合評估後決定從新編譯mysql,版本選擇,想了好久,決定用已經穩定,相應網上有不少資料來源的5.5版本mysql,編譯的過程以下
開始用cmake2.8.8.tar.gz,
# tar xfcmake-2.8.8.tar.gz
# cdcmake-2.8.8
# ./bootstrap
# make
# make install
cmake 官方說明
cmake的重要特性之一是其獨立於源碼(out-of-source)的編譯功能,即編譯工做能夠在另外一個指定的目錄中而非源碼目錄中進行,這能夠保證源碼目錄不受任何一次編譯的影響,所以在同一個源碼樹上能夠進行屢次不一樣的編譯,如針對於不一樣平臺編譯。
編譯mysql提示cmake安裝不對,MD5校對mysql,發現不對,果斷卸載,yum安裝
yum –y install cmake
而後rz上傳mysql-5.5.28.tar.gz到跳板機,而後scp推送到127數據庫(考慮是如今一臺數據庫服務器上先從新編譯,若是不對,至少還有一臺mysql沒有動過,可能恢復一些默認值,保險一些)。
cmake的編譯不一樣於make編譯方式,用cmake獲取幫組
./configure cmake . 編譯方式
./configure --help cmake . -LH or ccmake . 獲取編譯參數的幫組命令
編譯安裝mysql
mysql 5.5不一樣於5.6,須要在編譯的時候指定默認是inodb數據庫引擎,5.6以後就是默認的,可是5.1是不支持inodb,可是5.5.28修復了之前大量的bug,穩定並且資料好找。
編譯幫組
指定安裝文件的安裝路徑時經常使用的選項:
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql
-DMYSQL_DATADIR=/data/mysql
-DSYSCONFDIR=/etc
默認編譯的存儲引擎包括:csv、myisam、myisammrg和heap。若要安裝其它存儲引擎,可使用相似以下編譯選項:
-DWITH_INNOBASE_STORAGE_ENGINE=1
-DWITH_ARCHIVE_STORAGE_ENGINE=1
-DWITH_BLACKHOLE_STORAGE_ENGINE=1
-DWITH_FEDERATED_STORAGE_ENGINE=1
若要明確指定不編譯某存儲引擎,可使用相似以下的選項:
-DWITHOUT_<ENGINE>_STORAGE_ENGINE=1
好比:
-DWITHOUT_EXAMPLE_STORAGE_ENGINE=1
-DWITHOUT_FEDERATED_STORAGE_ENGINE=1
-DWITHOUT_PARTITION_STORAGE_ENGINE=1
如若要編譯進其它功能,如SSL等,則可以使用相似以下選項來實現編譯時使用某庫或不使用某庫:
-DWITH_READLINE=1
-DWITH_SSL=system
-DWITH_ZLIB=system
-DWITH_LIBWRAP=0
其它經常使用的選項:
-DMYSQL_TCP_PORT=3306
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock
-DENABLED_LOCAL_INFILE=1
-DEXTRA_CHARSETS=all
-DDEFAULT_CHARSET=utf8
-DDEFAULT_COLLATION=utf8_general_ci
-DWITH_DEBUG=0
-DENABLE_PROFILING=1
編譯安裝
# groupadd -r mysql
# useradd -g mysql -r –s /sbin/nologinmysql
# tar xf mysql-5.5.28.tar.gz
# cd mysql-5.5.28
# cmake . -DCMAKE_INSTALL_PREFIX=/opt/mysql\ 指定安裝目錄
-DMYSQL_DATADIR=/data/mysqldb \ 指定數據庫存放目錄
-DSYSCONFDIR=/etc \ 指定配置文件
-DWITH_INNOBASE_STORAGE_ENGINE=1\ 編譯indodb引擎進mysql,其實默認
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \ 編譯ARCHIVE引擎,其實默認編譯也有
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \ 編譯黑洞引擎,作mysql結構可能用到
-DWITH_SSL=system\ 支持ssl
-DWITH_ZLIB=system\ 支持zlib
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock\ 指定mysql客戶端sock文件
-DDEFAULT_CHARSET=utf8\ 指定默認字符集爲utf8
-DDEFAULT_COLLATION=utf8_general_ci 指定默認數據庫字符
報錯:
Could NOT find Curses (missing: CURSES_LIBRARY CURSES_INCLUDE_PATH)
CMake Error at cmake/readlineNaNake:82(MESSAGE):
Curses library not found. Please install appropriate package,
-- Configuring incomplete, errors occurred!
yum -y install ncurses-devel
rm CMakeCache.txt 刪除編譯文件,再次編譯再次報錯
Warning:Bison executable not found in PATH
yum –y install bison
-- The C compiler identification is unknown
-- The CXX compiler identification is unknown
提示沒有gcc編譯
yum –y install gcc gcc-c++
再次編譯提示OK
須要yum –yinstall bison gcc gcc-c++ ncurses-devel
make && makeinstall
配置mysql主從
原來備份的my.cnf用於新編譯的,把/opt下面的mysql.server拷貝到/etc/init.d目錄下面,啓動mysql,配置my.cnf,做爲主庫
server_id = 1 主庫的id值爲1
log_bin = /data/mysql5.5binlog/mysql-binlog 開啓binlog日誌
max_binlog_size = 512M binlog最大爲多少後,就自動更新
read-only = 1 表示可寫,0爲只讀
初始化mysql數據庫
/opt/mysql/scripts/mysql_install_db--user=mysql --basedir=/opt/mysql --datadir=/data/mysqldb
報錯(心都涼了)
[ERROR] COLLATION 'latin1_swedish_ci' isnot valid for CHARACTER SET
立刻想到51cto一篇博文提到過相似
解決:
在my.cnf文件中加入一行
character-set-server=latin1
從新初始化OK
啓動mysql
登陸設置相應的權限
建立mysql同步的用戶slaveyimi,設置爲只能從庫ip權限
作好相應準備,開始配置主從同步
主庫操做
主庫,鎖表備份全部全部庫,備份完以後,就unlock tables;解鎖表
必定不要--all-database (會備份數據庫結構)mysqldump -uroot -p amc|gzip > /backup/mysql/$(date+%F)-amc.sql.gz
mysqldump -uroot -p adhulu|gzip >/backup/mysql/$(date +%F)-adhulu.sql.gz
把sql.gz文件推送到從庫那臺服務器,從庫的mysql編譯安裝略
注意:從庫作完相應的配置,必定要重啓,我搗鼓半天原來是沒重啓,主從總是不對
導入全備數據
mysql -uroot -p'密碼' <full.sql
登陸數據庫,執行下面命令
CHANGE MASTER TO
MASTER_HOST='10.163.2.127', 主庫ip地址
MASTER_PORT=3306, 主庫端口
MASTER_USER='slaveyimi', 主從同步用戶
MASTER_PASSWORD='password', 用戶密碼
MASTER_LOG_FILE='mysql-binlog.000004', binlog最新文件名稱
MASTER_LOG_POS=108502907; 偏移值(查看showmaster status\G;獲取獲得)
開啓同步,slave start,不一樣版本不同,也多是start slave;
在從庫上查看是否同步
show slave status\G;
下面表示同步成功
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0
限制從庫寫入方法
在從庫的my.cnf的配置文件加入read-only
read-only = 1
並且在給從庫的用戶受權時候,必定不要給all權限,read-only對all權限的用戶沒有用
受權主庫只給insert,update,delete,select權限便可
grant select,insert,update,delete on'adhulu'.* to 'adhulu'@'%' identified by 'XXX';
受權主庫只給select權限便可
grant select on adhulu.* to 'adhulu'@'%'identified by 'XXX';
平時禁止任何人登陸從庫操做。