天天看點

不停止 MySQL 服務增加從庫的兩種方式

現在生産環境mysql資料庫是一主一從,由于業務量通路不斷增大,故再增加一台從庫。前提是不能影響線上業務使用,也就是說不能重新開機mysql服務,為了避免出現其他情況,選擇在網站通路量低峰期時間段操作。

不停止 MySQL 服務增加從庫的兩種方式

伺服器資訊:

主庫:192.168.18.212(原有)

從庫1:192.168.18.213(原有)

從庫2:192.168.18.214(新增)

資料庫版本:mysql5.5

存儲引擎:innodb

測試庫名:weibo

<a target="_blank"></a>

mysql主從是基于binlog日志,是以在安裝好資料庫後就要開啟binlog。這樣好處是,一方面可以用binlog恢複資料庫,另一方面可以為主從做準備。

原有主庫配置參數如下:

<code># vi my.cnf</code>

<code>server-id = 1 #id要唯一</code>

<code>log-bin = mysql-bin #開啟binlog日志</code>

<code>auto-increment-increment = 1 #在ubuntu系統中mysql5.5以後已經預設是1</code>

<code>auto-increment-offset = 1</code>

<code>slave-skip-errors = all #跳過主從複制出現的錯誤</code>

<code>mysql&gt; grant all on *.* to 'sync'@'192.168.18.%' identified by 'sync';</code>

<code>server-id = 3 #這個設定3</code>

<code>auto-increment-increment = 1 #這兩個參數在ubuntu系統中mysql5.5以後都已經預設是1</code>

<code># mysqldump -uroot -p123 --routines --single_transaction --master-data=2 --databases weibo &gt; weibo.sql</code>

參數說明:

--routines:導出存儲過程和函數

--single_transaction:導出開始時設定事務隔離狀态,并使用一緻性快照開始事務,然後unlock tables;而lock-tables是鎖住一張表不能寫操作,直到dump完畢。

--master-data:預設等于1,将dump起始(change master to)binlog點和pos值寫到結果中,等于2是将change master to寫到結果中并注釋。

<code># scp weibo.sql [email protected]:/home/root</code>

<code>mysql&gt; create table test_tb(id int,name varchar(30));</code>

<code># mysql -uroot -p123 -e 'create database weibo;'</code>

<code># mysql -uroot -p123 weibo &lt; weibo.sql</code>

<code># head -25 weibo.sql</code>

<code>-- change master to master_log_file='mysql-bin.000001', master_log_pos=107; #大概22行</code>

<code>mysql&gt; change master to master_host='192.168.18.212',</code>

<code>-&gt; master_user='sync',</code>

<code>-&gt; master_password='sync',</code>

<code>-&gt; master_log_file='mysql-bin.000001',</code>

<code>-&gt; master_log_pos=107;</code>

<code>mysql&gt; start slave;</code>

<code></code>

<code>mysql&gt; show slave status\g;</code>

<code>error 2006 (hy000): mysql server has gone away</code>

<code>no connection. trying to reconnect...</code>

<code>connection id: 90</code>

<code>current database: *** none ***</code>

<code>*************************** 1. row ***************************</code>

<code>slave_io_state: waiting for master to send event</code>

<code>master_host: 192.168.18.212</code>

<code>master_user: sync</code>

<code>master_port: 3306</code>

<code>connect_retry: 60</code>

<code>master_log_file: mysql-bin.000001</code>

<code>read_master_log_pos: 358</code>

<code>relay_log_file: mysqld-relay-bin.000003</code>

<code>relay_log_pos: 504</code>

<code>relay_master_log_file: mysql-bin.000001</code>

<code>slave_io_running: yes</code>

<code>slave_sql_running: yes</code>

<code>......</code>

可以看到io和sql線程均為yes,說明主從配置成功。

<code>mysql&gt; show tables;</code>

<code>+---------------------------+</code>

<code>| tables_in_weibo |</code>

<code>| test_tb |</code>

發現剛才模拟建立的test_tb表已經同步過來!

在上面配置基礎上做實驗,先删除掉從庫配置:

<code>mysql&gt; stop slave; #停止同步</code>

<code>mysql&gt; reset slave; #清除從連接配接資訊</code>

<code>mysql&gt; show slave status\g; #再檢視從狀态,可以看到io和sql線程都為no</code>

<code>mysql&gt; drop database weibo; #删除weibo庫</code>

此時,從庫現在和新裝的一樣,繼續前進!

<code># innobackupex --user=root --password=123 ./</code>

生成一個以時間為命名的備份目錄:2015-07-01_16-49-43

<code># ll 2015-07-01_16-49-43/</code>

<code>total 18480</code>

<code>drwxr-xr-x 5 root root 4096 jul 1 16:49 ./</code>

<code>drwx------ 4 root root 4096 jul 1 16:49 ../</code>

<code>-rw-r--r-- 1 root root 188 jul 1 16:49 backup-my.cnf</code>

<code>-rw-r----- 1 root root 18874368 jul 1 16:49 ibdata1</code>

<code>drwxr-xr-x 2 root root 4096 jul 1 16:49 mysql/</code>

<code>drwxr-xr-x 2 root root 4096 jul 1 16:49 performance_schema/</code>

<code>drwxr-xr-x 2 root root 12288 jul 1 16:49 weibo/</code>

<code>-rw-r--r-- 1 root root 21 jul 1 16:49 xtrabackup_binlog_info</code>

<code>-rw-r----- 1 root root 89 jul 1 16:49 xtrabackup_checkpoints</code>

<code>-rw-r--r-- 1 root root 563 jul 1 16:49 xtrabackup_info</code>

<code>-rw-r----- 1 root root 2560 jul 1 16:49 xtrabackup_logfile</code>

<code># scp -r 2015-07-01_16-49-43 [email protected]:/home/root</code>

<code># sudo rm -rf /var/lib/mysql/</code>

<code># sudo mv 2015-07-01_16-49-43/ /var/lib/mysql</code>

<code># sudo chown mysql.mysql -r /var/lib/mysql</code>

<code># sudo /etc/init.d/mysql start</code>

<code># ps -ef |grep mysql #檢視已經正常啟動</code>

<code>mysql 8832 1 0 16:55 ? 00:00:00 /usr/sbin/mysqld</code>

<code>mysql&gt; create table test_tb2(id int,name varchar(30));</code>

<code># cat /var/lib/mysql/xtrabackup_info</code>

<code>uuid = 201af9db-1fce-11e5-96b0-525400e4239d</code>

<code>name =</code>

<code>tool_name = innobackupex</code>

<code>tool_command = --user=root --password=... ./</code>

<code>tool_version = 1.5.1-xtrabackup</code>

<code>ibbackup_version = xtrabackup version 2.2.11 based on mysql server 5.6.24 linux (x86_64) (revision id: )</code>

<code>server_version = 5.5.43-0ubuntu0.12.04.1-log</code>

<code>start_time = 2015-07-01 16:49:43</code>

<code>end_time = 2015-07-01 16:49:46</code>

<code>lock_time = 1</code>

<code>binlog_pos = filename 'mysql-bin.000001', position 429 #這個位置</code>

<code>innodb_from_lsn = 0</code>

<code>innodb_to_lsn = 1598188</code>

<code>partial = n</code>

<code>incremental = n</code>

<code>format = file</code>

<code>compact = n</code>

<code>compressed = n</code>

<code>-&gt; master_log_pos=429;</code>

<code>read_master_log_pos: 539</code>

<code>relay_log_file: mysqld-relay-bin.000002</code>

<code>relay_log_pos: 363</code>

<code>| test_tb2 |</code>

發現剛才模拟建立的test_tb2表已經同步過來。

<b>原文釋出時間為:2015-07-10</b>

<b></b>

<b>本文來自雲栖社群合作夥伴“linux中國”</b>