CentOS系統MySQL雙機熱備配置

来源:http://www.cnblogs.com/agileai/archive/2016/12/02/6126823.html
-Advertisement-
Play Games

1 概述 在集成項目中需要應對不同環境下的安裝配置,主流操作系統大致可以分為三種:Linux、Windows以及UNIX。其中Linux備受青睞的主要原因有兩個: 首先,Linux作為自由軟體有兩個特點:一是它免費提供源碼,二是愛好者可以按照自己的需要自由修改、複製和發佈程式的源碼,並公佈在Inte ...


1  概述

在集成項目中需要應對不同環境下的安裝配置,主流操作系統大致可以分為三種:Linux、Windows以及UNIX。其中Linux備受青睞的主要原因有兩個:

首先,Linux作為自由軟體有兩個特點:一是它免費提供源碼,二是愛好者可以按照自己的需要自由修改、複製和發佈程式的源碼,並公佈在Internet上。這就吸引了世界各地的操作系統高手為Linux編寫各種各樣的驅動程式和應用軟體,使得Linux成為一種不僅只是一個內核,而且包括系統管理工具、完整的開發環境和開發工具、應用軟體在內,用戶很容易獲得的操作系統。

其次,究其根本,Linux是一個UNIX系統變種,因此也就具有了UNIX系統的一系列優良特性,UNIX上的應用可以很方便地移植到Linux平臺上,這使得UNIX用戶很容易掌握Linux。

基於Linux的安全可靠、效率高、免費、良好的網路支持、與UNIX完全相容等方面的考慮,Linux算是最常用的一種。這樣,在項目中就會有在Linux下安裝資料庫的需求,例如Oracle、MySQL等。本文主要介紹在Linux環境下安裝MySQL資料庫的兩種方式,以及MySQL資料庫的相關配置步驟,其中常見的一些問題也會進行說明,最後會展示一種比較常見的MySQL資料庫的備份方式——雙機熱備。

2  預期讀者

  • 數通暢聯新員工

  • 廣大技術愛好者

3  環境信息

操作系統:CentOS 6.4

MySQL版本為MySQL5.6

4  名詞解釋

Linux:Linux是一套免費使用和自由傳播的類Unix操作系統,是一個基於POSIX和UNIX的多用戶、多任務、支持多線程和多CPU的操作系統。它能運行主要的UNIX工具軟體、應用程式和網路協議。它支持32位和64位硬體。Linux繼承了Unix以網路為核心的設計思想,是一個性能穩定的多用戶網路操作系統。

CentOS(CommunityEnterprise Operating System,中文意思是:社區企業操作系統)是Linux發行版之一,它是來自於Red Hat Enterprise Linux依照開放源代碼規定釋出的源代碼所編譯而成。由於出自同樣的源代碼,因此有些要求高度穩定性的伺服器以CentOS替代商業版的Red Hat Enterprise Linux使用。兩者的不同,在於CentOS並不包含封閉源代碼軟體。

MySQL:MySQL是一個關係型資料庫管理系統,由瑞典MySQL AB 公司開發,目前屬於 Oracle 旗下產品。MySQL 最流行的關係型資料庫管理系統,在 WEB 應用方面MySQL是最好的 RDBMS (Relational Database Management System,關係資料庫管理系統) 應用軟體之一。

MYISAM:MySQL兩種常見的存儲引擎之一,特點是表數據文件和表索引文件都是獨立存放,適合記錄少於2000萬以下、併發量不是很高的環境,適合簡單的查詢,不支持事務,容易出現數據丟失,表損壞,經常需要修複,修複往往也導致數據丟失,適合讀多寫少的環境

INNODB:MySQL兩種常見的存儲引擎之一,特點是表數據文件和表索引文件是共同一個文件,適合大規模數據,小規模的數據反而效率不高,適合併發量高的環境、複雜的查詢,支持事務,支持數據自動修複,保證了數據丟失最少

5  操作步驟

5.1  安裝方式

在CentOS上安裝MySQL的方式大致可以分為兩類,一種是網路環境通暢的情況下,可以通過YUM庫聯網安裝,另一種是通過本地上傳MySQL介質進行安裝。

5.1.1   yum遠程安裝

  • 查看CentOS自帶MySQL是否已安裝

指令:yum list installed | grep mysql

  • 首先需要卸載依賴文件

指令:例如yum -y remove mysql-libs.x86_64

若有多個依賴文件則依次卸載,當結果顯示為Complete!即卸載完畢

  • 查看yum庫上的MySQL版本信息

指令:yum list | grep mysqlyum -y list mysql*

CentOS系統需要正常連接網路

  • 通過yum安裝MySQL

指令:yum -y install mysql-server mysql mysql-devel

  • 安裝時會顯示有衝突文件,移除衝突的文件

指令:例如yum -y remove MySQL-client-advanced-5.6.22*

  • 查詢是否已安裝MySQL

rpm -qa|grep -imysql

-i忽略大小寫

  • 成功安裝後,啟動MySQL失敗,需要查看一下MySQL的日誌信息來定位錯誤原因

less/var/log/mysqld.log

  • 啟動MySQL服務,更改資料庫密碼

mysql>update user set  password=password('YouPassword') where user='root';

mysql>FLUSH PRIVILEGES;

遠程連接時,防火牆啟用埠號

指令:iptables -I INPUT -p tcp--dport 3306 -j ACCEPT

5.1.2   本地介質安裝

  • 首先下載MySQL安裝包

mysql-advanced-5.6.23-linux-glibc2.5-x86_64.tar.gz

  • 解壓並放到安裝文件夾下,其中需要使用的是

MySQL資料庫:MySQL-server-5.6.22-1.linux_glibc2.5.x86_64.rpm

MySQL客戶端:MySQL-client-5.6.22-1.linux_glibc2.5.x86_64.rpm

  • 安裝前先檢查是否已安裝MySQL

指令:rpm -qa | grep mysql

  • 如果之前有安裝過MySQL,需要刪除已安裝的MySQL

指令:例如rpm -e --nodeps mysql-libs-5.1.47-4.el6.i686 

再次檢查是否已安裝MySQL

  • 安裝MySQL服務端

指令:rpm -ivh MySQL-server-5.6.22-1.linux_glibc2.5.x86_64.rpm

Preparing...  ########################################### [100%]

1:MySQL-server  ########################################### [100%]

A RANDOM PASSWORD HAS BEEN SET FOR THE  MySQL root USER !

You will find that password in  '/root/.mysql_secret'.

You must change that password on your  first connect,

no other statement but 'SET PASSWORD'  will be accepted.

See the manual for the semantics of the  'password expired' flag.

Also, the account for the anonymous user  has been removed.

In addition, you can run:

/usr/bin/mysql_secure_installation

which will also give you the option of  removing the test database.

This is strongly recommended for  production servers.

See the manual for more instructions.

Please report any problems at  http://bugs.mysql.com/

The latest information about MySQL is  available on the web at

http://www.mysql.com

Support MySQL by buying support/licenses  at http://shop.mysql.com

New default config file was created as  /usr/my.cnf and

will be used by default by the server  when you start it.

You may edit this file to change server  settings

  • 檢查MySQL 3306埠是否打開了

指令:netstat –nat

發現還沒有3306的埠,說明MySQL服務還沒有啟動

啟動MySQL服務

指令:service mysql start

Starting MySQL.......... SUCCESS!

啟動成功後,再次檢查3306埠號

  • 安裝客戶端

指令:rpm -ivh MySQL-client-5.6.22-1.linux_glibc2.5.x86_64.rpm

Preparing...  ########################################### [100%]

1:MySQL-client  ^C########################################### [100%]

5.2   配置過程

5.2.1   備份方式

MySQL的常用備份方式可分為三種:

  •  邏輯備份

優點:最大好處是能夠與正在運行的MySQL自動協同工作,在運行期間可以確保備份是當時的點,它會自動將對應操作的表鎖定,不允許其他用戶修改(只能訪問),可能會阻止修改操作,SQL文件通用方便移植。

缺點:備份的速度比較慢,如果是數據量很多的時候,就很耗時間。如果資料庫伺服器處在提供給用戶服務狀態,在這段長時間操作過程中,意味著要鎖定表(一般是讀鎖定,只能讀不能寫入數據),那麼服務就會影響的。

  • 物理備份

直接拷貝只適用於MYISAM類型的表。這種類型的表是與機器獨立的。但實際情況是,設計資料庫的時候不可能全部使用MYISAM類型表。也不可能:因為MYISAM類型表與機器獨立,方便移植,於是就選擇這種表,這並不是選擇它的理由。

缺點:不能去操作正在運行的MySQL伺服器(在拷貝的過程中有用戶通過應用程式訪問更新數據,這樣就無法備份當時的數據)可能無法移植到其他機器上去。

更多的情況是,會根據業務特點(比如需要支持事務機制就必須使用INNODB),查詢速度和服務性能來選擇表類型的。

  • 雙機熱備份

MySQL資料庫沒有增量備份的機制。當數據量太大的時候備份是一個很大的問題。還好MySQL資料庫提供了一種主從備份的機制(也就是雙機熱備)

優點:適合數據量大的時候。大的互聯網公司對於MySQL數據備份,都是採用熱機備份。搭建多台資料庫伺服器,進行主從複製。

實現機制:對於一個MySQL伺服器,一般有兩個線程來負責複製和被覆制。當開啟複製之後:

  • 作為主伺服器Master,會把自己的每一次改動都記錄到二進位日誌 binlog 中。(從伺服器會負責來讀取這個log,然後在自己那裡再執行一遍。)

  • 作為從伺服器Slave,會用master上的賬號登陸到master上,讀取master的binlog,寫入到自己的中繼日誌 Relaylog,然後自己的SQL線程會負責讀取這個中繼日誌,並執行一遍。 

在考慮雙機熱備時,需要註意,一般意義上的雙機熱備都會有一個切換過程,這個切換過程可能是一分鐘左右。在切換過程中,服務是有可能短時間中斷的。但是,當切換完成後,服務將正常恢復。因此,雙機熱備不是無縫、不中斷的,但它能夠保證在出現系統故障時,能夠很快恢復正常的服務,業務不致受到影響。而如果沒有雙機熱備,則一旦出現伺服器故障,可能會出現幾個小時的服務中斷,對業務的影響就可能會造成很嚴重的損失。

5.2.2   配置步驟

環境要求:

  1. 主資料庫(Master)IP:10.254.1.248

  2. 備份資料庫(Slave)IP:10.254.1.249

  3. 備份前保證兩個資料庫的數據一致

Master

  • 進入MySQL命令行, 給備份主機賦予複製許可權,即備份主機使用用戶名backup,密碼123456就可以連接到主伺服器,backup就是同步賬號

grant file,select,replication slave on  *.* to [email protected] identified by '123456';

  • 修改配置文件my.cnf[mysqld]:

sevice-id=1

log-bin=mysql-bin --------------打開日誌開關,二進位日誌文件

max_binlog_size=104857600

binlog_format=mixed--------日誌模式row level和statement level的結合

binlog-do-db= aeaiesb -------------在aeaiesb庫進行的操作記錄二進位日誌文件,而不是對aeaiesb庫的操作

binlog-ignore-db=mysql  --------------------忽略對mysql庫的操作,即不記錄到日誌中

  • 查看master狀態

在MySQL命令行:

show master status

mysql> show master status;

+----------------------+-----------+------------------+------------------+

| File         | Position | Binlog_Do_DB |  Binlog_Ignore_DB |

+----------------------+-----------+-------------------+------------------+

| mysql-bin.000013 |     1150 | aeaiesb | mysql    |

+-----------------------+----------+------------------+------------------+

1 row in set (0.00 sec)

結果表示現在寫日誌的文件是mysql-bin.000013,位置是1105,slave端要從這個點開始同步備份aeaiesb

slave

  • 停掉資料庫

service mysql stop

  • 修改配置文件my.cnf,添加如下配置

server-id=2

replicate-same-server-id

master-host=10.254.1.248

master-user=backup

master-password=123456

master-port=3306

master-connect-retry=60 ----重覆連接時間間隔

replicate-do-db=aeaiesb---同步master的aeaiesb庫

relay-log=miniweb2-relay-bin----設置I/O線程讀master的binlog並寫入本地的文件名,即為relay-log

  • 重啟資料庫

service mysql start

  • 在MySQL命令行, 查看slave狀態

mysql> show slave status/G;

***************************  1. row ***************************

Slave_IO_State:

Master_Host: 10.254.1.248

Master_User: backup

Master_Port: 3306

Connect_Retry: 60

Master_Log_File: mysql_bin.000013

Read_Master_Log_Pos: 1105

Relay_Log_File:  localhost-relay-bin.000001

Relay_Log_Pos: 4

Relay_Master_Log_File: mysql_bin.000013

Slave_IO_Running: No

Slave_SQL_Running: Yes

Replicate_Do_DB: aeaiesb

  • 這時 Slave_IO_Running的值是No,I/O線程沒有啟動,是無法進行同步的處理步驟:

1) 在命令行下:

(1)slave stop;

(2)change master to  master_host='10.254.1.248',master_user='backup',master_password='123456',master_log_file='mysql-bin.000014',master_log_pos=1150  ;(前面查看的master狀態)

(3)slave start;

(4)show slave status;

mysql>  show slave status/G;                                                                                                          *************************** 1. row ***************************

Slave_IO_State: Waiting for master to  send event

Master_Host: 10.254.1.248

Master_User: backup

Master_Port: 3306

Connect_Retry: 60

Master_Log_File: mysql-bin.000013

Read_Master_Log_Pos: 1105

Relay_Log_File:  localhost-relay-bin.000002

Relay_Log_Pos: 251

Relay_Master_Log_File: mysql-bin.000013

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

Replicate_Do_DB: aeaiesb

這樣就可以進行同步了,在master的aeaiesb庫中創建表,並插入數據會實時在slave端顯示。

5.3   常見問題

5.3.1   更改MySQL數據存儲位置

首先,MySQL安裝完成後不像 SQLServer 預設安裝在一個目錄,它的資料庫文件、配置文件和命令文件分別在不同的目錄,瞭解這些目錄非常重要,尤其對於Linux的初學者,因為 Linux本身的目錄結構就比較複雜,如果搞不清楚MySQL的安裝目錄那就無從談起深入學習。

a、資料庫目錄     /var/lib/mysql/

b、配置文件         /usr/share/mysql(mysql.server命令及配置文件)

c、相關命令         /usr/bin(mysqladmin mysqldump等命令)

      d、啟動腳本          /etc/rc.d/init.d/(啟動腳本文件mysql的目錄)

其次,由於MySQL資料庫目錄占用磁碟比較大,而MySQL預設的數據文件存儲目錄為 /"var/lib/mysql",也可以把要把數據目錄移到"/" 根目錄下的 "mysqldata" 目錄中

  • 首先停止MySQL服務

終端執行命令

/etc/init.d/mysql  stop

  • 在終端將原來mysql資料庫目錄文件全部都複製到新的資料庫目錄下

cp -r /var/lib/mysql  /disk1/mysqldata

  • 修改my.cnf配置文件

先備份,再修改

cp /etc/my.cnf  /etc/my.cnfbak

vi /etc/my.cnf

在打開的文件中找到datadir這行代碼,查看後面的路徑,做備份(在這行代碼前加#)

原路徑:/var/lib/mysql

新路徑:/disk1/mysqldata

  • 修改mysqld

先備份,再修改

 cp /etc/init.d/mysqld /etc/init.d/mysqldbak

vi  /etc/init.d/mysqld

datadir原路徑:/var/lib/mysql

datadir新路徑:/disk1/mysqldata

  • 修改mysqld_safe文件

cp /usr/bin/mysqld_safe  /usr/bin/mysqld_safebak

vi  /usr/bin/mysqld_safe 

datadir原路徑:/var/lib/mysql

datadir新路徑:/disk1/mysqldata

  • 建立一個mysql.sock的鏈接

ln -s /disk1/mysqldata  /mysql.sock /var/lib/mysql/mysql.sock 

  • 重啟服務

service mysqld  start 

  • 進入MySQL命令行查詢數據文件目錄地址

mysql> show variables like '%dir%';

5.3.2   啟動失敗可能的錯誤原因

通過查看MySQL日誌時發現Table ‘mysql.plugin’ doesn’t exist這樣的問題,這是因為新安裝的MySQL需要初始化資料庫

解決步驟:

1) 進入./mysql/bin目錄下,執行腳本./mysql_install_db;

2) 執行完(1)後,此時會在./mysql/var目錄下創建兩個目錄文件mysql、test;

3) 修改mysql、test兩個目錄及目錄下所有文件的許可權:

指令:chown mysql:mysql -R mysql test

  • 日誌報錯

mysqld_safe Starting mysqld daemon with  databases from /var/lib/mysql

 [Warning] Can't create test file  /var/lib/mysql/localhost.lower-test

[Warning] Can't create test file  /var/lib/mysql/localhost.lower-test

/usr/sbin/mysqld: Can't change dir to  '/var/lib/mysql/' (Errcode: 13)

 [ERROR] Aborting

 [Note] /usr/sbin/mysqld: Shutdown complete

首先關閉selinux服務

cd /etc/selinux

vi config

修改selinux為disabled,重啟機器

  • 啟動失敗時

Fatal error: Can't open and lock  privilege tables: Table 'mysql.host' doesn't exist

使用命令

mysql_install_db --user=mysql 

初始化命令

  • 啟動MySQL成功後,登錄時

ERROR 1045 (28000): Access denied for  user 'root'@'localhost' (using password: YES)   

需要重置密碼

1) 首先停止MySQL服務

service mysql stop  

2) 用mysqld_safe重啟服務

/usr/bin/mysqld_safe --skip-grant-tables

3) 無密碼登錄

mysql –u root

4) 授權

grant all privileges on *.* to  'root'@'localhost' identified by '密碼' with grant  option;

  • 授權新的資料庫文件存放地址

chown -R mysql:mysql /disk1/mysqldata

6  相關鏈接

CentOS鏡像下載:

http://www.linuxidc.com/Linux/2007-09/7399p3.htm


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ...
  • 當下,隨著移動時代的到來,手機功能逐步完善,各個行業針對這一現象紛紛制定了相應的營銷計劃,於是霎時間興起了一股網上訂票/網上訂飯/網上預約的熱潮。 而對於IT行業,成為企業信息化最火的代名詞莫過於移動辦公了,幾乎所有的軟體廠商都把推廣的重點轉移到移動辦公的市場上,幾乎在同一時間,大量的移動辦公APP ...
  • 前言: 目前工作負責兩個醫療APP項目的開發,同時使用LeanCloud進行雲端配合開發,完全單挑。 現大框架已經完成,正在進行細節模塊上的開發 抽空總結一下Android項目的開發規範:1、編碼規範 2、命名規範 註:個人經驗,經供參考 一、Android編碼規範 1、學會使用string.xml ...
  • android6.0之後許可權需要動態申請。 尤其是存儲許可權。 如果不申請會出現各種莫名其妙的bug。 本文說明瞭如何解決許可權申請的問題。 供大家參考和一起學習。 ...
  • 第一範式:確保每列的原子性(欄位不可分). 如果每列(或者每個屬性)都是不可再分的最小數據單元(也稱為最小的原子單元),則滿足第一範式. 例如:顧客表(姓名、編號、地址、……)其中"地址"列還可以細分為國家、省、市、區等。 第二範式:在第一範式的基礎上更進一層,目標是確保表中的每列都依賴於主鍵. 如 ...
  • flume配置: #DBFile DBFile.sources = sources1 DBFile.sinks = sinks1 DBFile.channels = channels1 # DBFile-DB-Source DBFile.sources.sources1.type = spooldi... ...
  • MYSQL保存BOOLEAN值時用1代表TRUE,0代表FALSE,boolean在MySQL里的類型為tinyint(1), MySQL里有四個常量:true,false,TRUE,FALSE,它們分別代表1,0,1,0, ...
  • 未分區的表,只能存儲在一個FileGroup中;對Table進行分區後,每一個分區都存儲在一個FileGroup,或分散式存儲在不同的FileGroup中。對錶進行分區的過程,是將邏輯上完整的一個表,按照特定的欄位拆分成多個分區,分散到(相同或不同的)FileGroup中,每一個部分叫做表的一個分區 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...