mysql啓動故障(簡寫)

問題描述和思路mysql

下午作svn鉤子文檔時,開發大哥跑來,說mysql啓動報錯,半個小時沒找到解決的辦法,報錯內容爲:StartingMySQL. ERROR! The server quit without updating PID filec++

根據大哥的描述,立刻想到多是mysql高速運行下,作大量數據查詢時候,卡的時候,強制殺掉mysql數據庫,因爲主主模式不是很熟悉,判斷是兩邊數據寫入不同,致使起不來,立刻想到單個服務器啓動,進入127服務器,打開my.cnf文件,server-id註銷,啓動仍是報錯,查看日誌,也是提示找不到pid文件,進入相關目錄/var/run/mysqld/mysqld.pid,發現根本沒有,在數據庫配置文件中指定mysql.pid文件仍是報錯,可能大體分析出強制殺掉進程致使數據結構出現問題,mysqld_safe --user=mysql &安全模式進入,可是仍是報錯,因爲不熟悉公司總體架構,這時已經有點絕望,大哥過來講先找到備份問題,而後考慮從新初始化,可是mysqlyum安裝,沒有install_db初始化命令。這時候,沈哥找到了備份數據,上月的全備,根據相應的腳本也找到相應的增量備份。sql

 

 

問題過後回顧數據庫

啓動mysql服務時出現以下錯誤,可查看錯誤日誌找出錯誤緣由。bootstrap

ErrorStarting 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而字符集是latin1app

解決方法:在配置文件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_logfile0ib_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

默認編譯的存儲引擎包括:csvmyisammyisammrgheap。若要安裝其它存儲引擎,可使用相似以下編譯選項:

-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-onlyall權限的用戶沒有用

受權主庫只給insertupdatedeleteselect權限便可

grant select,insert,update,delete on'adhulu'.* to 'adhulu'@'%' identified by 'XXX';

受權主庫只給select權限便可

grant select on adhulu.* to 'adhulu'@'%'identified by 'XXX';

平時禁止任何人登陸從庫操做。

相關文章
相關標籤/搜索