日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL从服务器写入报错吗_MySQL主从复制读写分离及奇怪的问题

發布時間:2023/12/15 数据库 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL从服务器写入报错吗_MySQL主从复制读写分离及奇怪的问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

聯系郵箱:hi@jackcool.net

一直都沒有寫blog的習慣,以前總覺得自己的腦子就是最好的記憶容器,現在覺得我好像有個假腦子。

當時是使用阿里云鏡像,安裝了兩臺ECS,結果配置MySQL的時候出現了UUID重復問題。

先從配置主從開始吧,值得記錄。

文中很多部分引用了網絡上的零碎資料!

場景

一般應用對數據庫而言都是“讀多寫少”,也就說對數據庫讀取數據的壓力比較大,有一個思路就是說采用數據庫集群的方案,

基本的原理是讓主數據庫處理事務性查詢,而從數據庫處理SELECT查詢。數據庫復制被用來把事務性查詢導致的變更同步到集群中 的從數據庫。 當然,主服務器也可以提供查詢服務。使用讀寫分離最大的作用無非是環境服務器壓力

讀寫分離的好處(資料):

1.MySQL復制另外一大功能是增加冗余,提高可用性,當一臺數據庫服務器宕機后能通過調整另外一臺從庫來以最快的速度恢復服務,因此不能光看性能,也就是說1主1從也是可以的。

2.多機器(集群)的處理能力

3.對于讀操作為主的應用,使用讀寫分離是最好的場景,因為可以確保寫的服務器壓力更小,而讀又可以接受點時間上的延遲。

4.主從只負責各自的寫和讀,極大程度的緩解X鎖和S鎖爭用

5.從庫可配置myisam引擎,提升查詢性能以及節約系統開銷

6.從庫同步主庫的數據和主庫直接寫還是有區別的,通過主庫發送來的binlog恢復數據,但是,最重要區別在于主庫向從庫發送binlog是異步的,從庫恢復數據也是異步的

7.讀寫分離適用與讀遠大于寫的場景,如果只有一臺服務器,當select很多時,update和delete會被這些select訪問中的數據堵塞,等待select結束,并發性能不高。 對于寫和讀比例相近的應用,應該部署雙主相互復制

8.可以在從庫啟動是增加一些參數來提高其讀的性能,例如--skip-innodb、--skip-bdb、--low-priority-updates以及--delay-key-write=ALL。當然這些設置也是需要根據具體業務需求來定得,不一定能用上

9.分攤讀取。假如我們有1主3從,不考慮上述1中提到的從庫單方面設置,假設現在1 分鐘內有10條寫入,150條讀取。那么,1主3從相當于共計40條寫入,而讀取總數沒變,因此平均下來每臺服務器承擔了10條寫入和50條讀取(主庫不 承擔讀取操作)。因此,雖然寫入沒變,但是讀取大大分攤了,提高了系統性能。另外,當讀取被分攤后,又間接提高了寫入的性能。所以,總體性能提高了,說白 了就是拿機器和帶寬換性能。MySQL官方文檔中有相關演算公式:官方文檔 見6.9FAQ之“MySQL復制能夠何時和多大程度提高系統性能”

原理

MySQL主(稱master)從(稱slave)復制的原理:

master將數據改變記錄到二進制日志(binary log)中,也即是配置文件log-bin指定的文件(這些記錄叫做二進制日志事件,binary log events)

slave將master的binary log events拷貝到它的中繼日志(relay log)

slave重做中繼日志中的事件,將改變反映它自己的數據(數據重演)

注意

主DB server和從DB server數據庫的版本一致

主DB server和從DB server數據庫數據一致,這里就會可以把主的備份在從上還原,也可以直接將主的數據目錄拷貝到從的相應數據目錄

主DB server開啟二進制日志,主DB server和從DB server的server_id及auto.cnf中的UUID都必須唯一

操作

1、主從服務器分別作以下操作:

1.1、版本一致

1.2、初始化表,并在后臺啟動mysql

1.3、修改root的密碼

2、修改主服務器Master的MySQL配置文件

$ vi /etc/my.cnf(默認)

[mysqld]

log-bin=mysql-bin //[必須]啟用二進制日志

server-id=93 //[必須]服務器唯一ID,默認是1,一般取IP最后一段

# 指定同步的數據庫, 如果 不指定則同步全部數據庫

binlog-do-db= testdb

3、修改從服務器slave

$ vi /etc/my.cnf

[mysqld]

server-id=211 //[必須]服務器唯一ID,默認是1,一般取IP最后一段

4、重啟兩臺服務器的MySQL

$ /etc/init.d/mysql restart

$ service mysqld restart

5、在主服務器上建立帳戶并授權slave:

$ /usr/local/mysql/bin/mysql -uroot -p 或直接 mysql -u root -p

mysql>GRANT REPLICATION SLAVE ON *.* to 'slave'@'%' identified by '123456';

mysql>flush privileges;

//一般不用root帳號,%表示所有客戶端都可能連,只要帳號、密碼正確,此處可用具體客戶端IP代替,如192.168.145.226,加強安全。

6、登錄主服務器的MySQL,查詢Master的狀態

mysql>show master status\G;

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

| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |

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

| mysql-bin.000004 | 308 | | |

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

1 row in set (0.00 sec)

注:執行完此步驟后不要再操作主服務器MYSQL,防止主服務器狀態值變化

7、配置從服務器Slave:

mysql>change master to master_host='192.168.145.222',master_user='slave',master_password='123456',

master_log_file='mysql-bin.000004',master_log_pos=308;

//注意不要斷開,308數字前后無單引號。

Mysql>start slave; //啟動從服務器復制功能

8、檢查從服務器(Slave)復制功能狀態:

mysql> show slave status\G

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

Slave_IO_State: Waiting for master to send event

Master_Host: 192.168.2.222 //主服務器地址

Master_User: slave //授權帳戶名,盡量避免使用root

Master_Port: 3306 //數據庫端口,部分版本沒有此行

Connect_Retry: 60

Master_Log_File: mysql-bin.000004

Read_Master_Log_Pos: 600 //#同步讀取二進制日志的位置,大于等于Exec_Master_Log_Pos

Relay_Log_File: ddte-relay-bin.000003

Relay_Log_Pos: 251

Relay_Master_Log_File: mysql-bin.000004

Slave_IO_Running: Yes //此狀態必須YES

Slave_SQL_Running: Yes //此狀態必須YES

......

注:Slave_IO及Slave_SQL進程必須正常運行,即YES狀態,否則都是錯誤的狀態(如:其中一個NO均屬錯誤)。

以上操作過程,主從服務器配置完成。

10、監控:

據說可以編寫一shell腳本,用nagios監控slave的兩個yes(Slave_IO及Slave_SQL進程),如發現只有一個或零個yes,就表明主從有問題了。

問題

配置mysql主從時,由于是阿里云鏡像系統盤拷貝的MySQL目錄,導致主從MySQL UUID相同, Slave_IO無法啟動,報錯信息如下:

The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.

解決辦法:

mysql>show variables like '%log_error%';//查看配置的日志地址,查看日志

修改MySQL data 目錄下auto.cnf 文件中uuid的值,使兩臺MySQL不同即可,

$ find / -name auto.cnf 或 find / -name "auto.cnf"

修改后重啟MySQL服務。

總結

以上是生活随笔為你收集整理的MySQL从服务器写入报错吗_MySQL主从复制读写分离及奇怪的问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。