MySQL系列(四)

本章內容:mysql

  •  主從複製
  •  簡介原理
  •  Mysql主從同步腳本部署
  • 讀寫分離
  • 若是主宕機了,怎麼辦?
  • 雙主的狀況
  • MySQL 備份及恢復方案
  • 備份單個及多個數據庫
  • mysqldump 的經常使用參數
  • 如何增量恢復呢?
  • 增量恢復的必要條件
  • 生產環境 mysqldump 備份命令
  • 恢復

1.MySQL主從複製

1.1簡介即原理

咱們爲何要用主從複製?web

主從複製目的:sql

能夠作數據庫的實時備份,保證數據的完整性;數據庫

可作讀寫分離,主服務器只管寫,從服務器只管讀,這樣能夠提高總體性能。vim

原理圖:服務器

1.2MySQL主從同步腳本部署

mysql多實例一鍵主從同步,3306同步到3307網絡

注意:併發

檢查主從配置文件server-idlog-binapp

[root@oldboy opt]#  egrep "log-bin|server-id" /data/3306/my.cnf 
log-bin = /data/3306/mysql-bin
server-id = 1
[root@oldboy opt]#  egrep "log-bin|server-id" /data/3307/my.cnf 
#log-bin = /data/3307/mysql-bin
server-id = 3

1.2.1備份和show master日誌位置

[root@data-1-1 tools]# cat auto_mysql3306_bak.sh 
#!/bin/sh
#this scripts is created by zsq
#zsq trainning QQ :493939840

MYUSER=root
MYPASS="oldboy123"
MYSOCK=/data/3306/mysql.sock

[ ! -d /backup ] && mkdir -p /backup
MAIN_PATH=/backup
DATA_PATH=/backup
LOG_FILE=${DATA_PATH}/mysqllogs_`date +%F`.log
DATA_FILE=${DATA_PATH}/mysql_backup_`date +%F`.sql.gz

MYSQL_PATH=/application/mysql/bin
MYSQL_CMD="$MYSQL_PATH/mysql -u$MYUSER -p$MYPASS -S $MYSOCK"
MYSQL_DUMP="$MYSQL_PATH/mysqldump -u$MYUSER -p$MYPASS --events --ignore-table=mysql.events -S $MYSOCK -A  -B --flush-logs --single-transaction -e"


$MYSQL_CMD -e "grant replication slave on *.* to oldboy@'192.168.179.%' identified by '123456';"
$MYSQL_CMD -e "flush tables with read lock;" 
echo "-----show master status result-----" >>$LOG_FILE
$MYSQL_CMD -e "show master status;" >>$LOG_FILE
${MYSQL_DUMP} | gzip > $DATA_FILE
$MYSQL_CMD -e "unlock tables;"
echo "ok"

1.2.2執行備份腳本

[root@data-1-1 tools]# sh auto_mysql3306_bak.sh 
-- Warning: Skipping the data of table mysql.event. Specify the --events option explicitly.
auto_mysql3306_bak.sh: line 26: mail: command not found

提示:-- Warning: Skippingsocket

由於mysqldump默認是不備份事件表的,只有加了--events 纔會解決 加上--events --ignore-table=mysql.events參數便可

示例

[root@data-1-1 ~]# /application/mysql/bin/mysqldump -uroot -poldboy123 --events --ignore-table=mysql.events -S /data/3307/mysql.sock -A  -B --flush-logs --single-transaction -e |gzip >/tmp/mysql_backup_`date +%F`.sql.gz
[root@data-1-1 tools]# ls /backup/               
mysql_backup_2016-09-02.sql  mysqllogs_2016-09-02.log
[root@data-1-1 tools]# cat /backup/mysqllogs_2016-09-02.log 
-----show master status result-----
File    Position    Binlog_Do_DB    Binlog_Ignore_DB
mysql-bin.000009    261    

1.2.3執行同步腳本

[root@data-1-1 tools]# cat auto_mysql3307_slave.sh 
#!/bin/sh
################################################
#this scripts is created by zsq
#zsq trainning QQ :493939840
################################################


MYUSER=root
MYPASS="oldboy123"
MYSOCK=/data/3307/mysql.sock

MAIN_PATH=/backup
DATA_PATH=/backup
LOG_FILE=${DATA_PATH}/mysqllogs_`date +%F`.log
DATA_FILE=${DATA_PATH}/mysql_backup_`date +%F`.sql.gz

MYSQL_PATH=/application/mysql/bin
MYSQL_CMD="$MYSQL_PATH/mysql -u$MYUSER -p$MYPASS -S $MYSOCK"

#recover
cd ${DATA_PATH}
gzip -d mysql_backup_`date +%F`.sql.gz
$MYSQL_CMD < mysql_backup_`date +%F`.sql

#config slave
cat |$MYSQL_CMD<< EOF
CHANGE MASTER TO  
MASTER_HOST='192.168.179.186',                  #注意這是主的節點IP 
MASTER_PORT=3306,
MASTER_USER='oldboy', 
MASTER_PASSWORD='123456', 
MASTER_LOG_FILE="`tail -1 $LOG_FILE|cut -f1`",
MASTER_LOG_POS=`tail -1 $LOG_FILE|cut -f2`;
EOF
$MYSQL_CMD -e "start slave;"
$MYSQL_CMD -e "show slave status\G"|egrep "IO_Running|SQL_Running" 

1.3查看狀態 

[root@data-1-1 backup]# /application/mysql/bin/mysql -uroot -poldboy123 -S /data/3307/mysql.sock -e "show slave status\G"|egrep "IO_Running|SQL_Running" 
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes        

1.4測試,登錄主數據庫,備數據庫查看

[root@data-1-1 tools]# mysql -uroot -poldboy123 -S /data/3306/mysql.sock
mysql> create database sisi;
Query OK, 1 row affected (0.00 sec)

mysql> use sisi 
Database changed
mysql> create table t(id int);
Query OK, 0 rows affected (0.31 sec)
mysql> insert into t values(01);
Query OK, 1 row affected (0.04 sec)
mysql> select * from t;
+------+
| id   |
+------+
|    1 |
+------+
1 row in set (0.04 sec)
[root@data-1-1 tools]# mysql -uroot -poldboy123 -S /data/3307/mysql.sock
 mysql> select * from sisi.t;
+------+
| id   |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

2.配置mysql從庫級聯複製

因爲前一次咱們只配置了主庫3306、從庫3307,這一次咱們還須要添加從庫3308

1、下面讓咱們來配置mysql 3308的多實例啓動方法:

mkdir -p /data/3308/data
\cp /data/3306/my.cnf  /data/3308/
\cp /data/3306/mysql  /data/3308/
sed -i 's/3306/3308/g' /data/3308/my.cnf 
sed -i 's/server-id = 1/server-id = 9/g' /data/3308/my.cnf 
sed -i 's/3306/3308/g' /data/3308/mysql
chown -R mysql:mysql /data/3308
chmod 700 /data/3308/mysql
cd /application/mysql/scripts
./mysql_install_db --datadir=/data/3308/data --basedir=/application/mysql --user=mysql
chown -R mysql:mysql /data/3308
egrep "server-id|log-bin" /data/3308/my.cnf 
/data/3308/mysql start
sleep 5
netstat -lnt|grep 3308
mysqladmin -u root password 'zsq3308' -S /data/3308/mysql.sock  #初始化3308數據庫密碼

2.1查看mysql 3306 3307 3308各個服務是否開啓

[root@zsq scripts]# netstat -lntup|grep 330
tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      3600/mysqld         
tcp        0      0 0.0.0.0:3307                0.0.0.0:*                   LISTEN      4332/mysqld         
tcp        0      0 0.0.0.0:3308                0.0.0.0:*                   LISTEN      5251/mysqld

配置mysql從庫級聯複製

境是:3306主庫 3307從庫 3308從庫

作了主庫3306到從庫3307,因此如今咱們要實現的需求是,當主庫3306產生bin_log,發給從庫,從庫3307產生的bin_log文件發送給其餘從庫3308

2.1.1)開啓從庫3307log-bin日誌文件

sed -i 's@#log-bin = /data/3307/mysql-bin@log-bin = /data/3307/mysql-bin@g' /data/3307/my.cnf

2.1.2)在3307從庫配置文件my.cnf[mysqld]模塊添加 以下內容

log-bin = /data/3307/mysql-bin
log-slave-updates = 1
expire_logs_days = 7
#重啓數據庫3307
[root@zsq data]# /data/3307/mysql stop                         
Stoping MySQL...
[root@zsq data]# /data/3307/mysql start
Starting MySQL...
若是現下面的錯誤的時候
[root@zsq data]# /data/3307/mysql stop
Stoping MySQL...
/application/mysql/bin/mysqladmin: connect to server at 'localhost' failed
error: 'Access denied for user 'root'@'localhost' (using password: YES)'
那是由於咱們在作單臺主從複製的時候,是將主服務器整個包導入到從庫3307的,因此修改從庫3307的啓動文件mysqld
sed -i 's/zsq3307/zsq3306/g' /data/3307/mysql

2.1.3)登錄從庫3307,查看log_slave_updates狀態是否開啓

mysql> show variables like "log_slave_updates";
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| log_slave_updates | ON    |
+-------------------+-------+
1 row in set (0.00 sec)

2.1.4)經過mysqldump導出從庫3307數據文件

mysqldump -uroot -pzsq3306 -S /data/3307/mysql.sock -A --events -B -F -x --master-data=1|gzip > /opt/zsq.sql.gz  
#--master-data=1,表示在zsq.sql文件中將取消註釋「CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=107;

2.1.5)解壓數據庫,並導入從庫3308

cd /opt/
gzip -d zsq.sql.gz
mysql -uroot -pzsq3308 -S /data/3308/mysql.sock <zsq.sql

2.1.6) 登陸從數據庫3308

mysql -uroot -pzsq3308 -S /data/3308/mysql.sock
mysql> CHANGE MASTER TO  MASTER_HOST='192.168.10.102',  MASTER_PORT=3307, MASTER_USER='rep',  MASTER_PASSWORD='zsq123';
mysql> start slave;                                                #開啓從庫3307到從庫3308同步開關
mysql> show slave status\G;                               #查看從庫3308狀態
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.179.102
                  Master_User: rep
                  Master_Port: 3307
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000005
          Read_Master_Log_Pos: 188
               Relay_Log_File: relay-bin.000007
                Relay_Log_Pos: 334
        Relay_Master_Log_File: mysql-bin.000005
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: mysql
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 188
              Relay_Log_Space: 527
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 3
1 row in set (0.00 sec)

ERROR: 
No query specified
View Code

使用此種方法也能快速查看從庫mysql的狀態

[root@zsq data]# mysql -uroot -p'zsq3307' -S /data/3307/mysql.sock -e "show slave status\G;"|egrep -i "_running|_Behind"         
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
        Seconds_Behind_Master: 0

2.1.7)登陸主庫3306,刪除測試數據庫

[root@zsq opt]# mysql -uroot -plx3306 -S /data/3306/mysql.sock
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| amoeba_test        |
| amoeba_test1       |
| amoeba_test2       |
| mysql              |
| performance_schema |
| sisi1              |
| test               |
+--------------------+
8 rows in set (0.00 sec)
mysql> drop database sisi1;
Query OK, 0 rows affected (0.00 sec)
[root@zsq opt]# mysql -uroot -plx3306 -S /data/3307/mysql.sock   #3307查看
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| amoeba_test        |
| amoeba_test1       |
| amoeba_test2       |
| mysql              |
| performance_schema |
| test               |
+--------------------+
7 rows in set (0.01 sec)
[root@zsq ~]# mysql -uroot -plx3308 -S /data/3308/mysql.sock
   #3308查看
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| amoeba_test        |
| amoeba_test1       |
| amoeba_test2       |
| mysql              |
| performance_schema |
| test               |
+--------------------+
7 rows in set (0.00 sec)

發現數據庫都被刪除了,至此mysql級聯複製配置完畢

2.1.8. 多實例mysql 修改密碼 

 

mysql> select user,host,password from mysql.user;
mysql> update mysql.user set password=PASSWORD('sisi') where user='root';
mysql> flush privileges;
配置文件不指定密碼重啓會報錯
[root@oldboy /]# cat /data/3308/mysql|grep "mysql_pwd="
mysql_pwd="sisi

3.mysql主主複製

應用場景:高併發場景,使用雙主雙寫,慎用!

注意: ID會衝突

解決 ID 衝突問題

方法一: 表的id自增,讓主A 135;主B 246

方法二:表的id不自增,經過web端程序去seqid,寫入雙主。

環境:主庫3306 ,從庫 3307

因爲咱們已經作了主庫3306到從庫3307,如今咱們須要將從庫3307變爲主庫,將3306做爲從庫

具體操做步驟:

3.1編輯數據庫配置文件

[root@zsq 3306]# cd /data/3306
[root@zsq 3306]# vim my.cnf            
……省略……
[mysqld]                # 如下內容加在[mysqld]下面
#________m-m m1 start________
auto_increment_increment    = 2        #自增ID的間隔
auto_increment_offset        = 1        #ID的初始位置
log-slave-updates   = 1
log-bin = /data/3306/mysql-bin
expire_logs_days = 7
#________m-m m1 end________
……省略……
重啓mysql
[root@zsq 3306]# ./mysql stop
Stoping MySQL...
[root@zsq 3306]# ./mysql start
Starting MySQL...

[root@zsq 3306]# cd /data/3307
[root@zsq 3307]# vim my.cnf     
……省略……
[mysqld]                # 如下內容加在[mysqld]下面
#________m-m m1 start________
auto_increment_increment = 2        #自增ID的間隔
auto_increment_offset  = 2        #ID的初始位置
log-slave-updates   = 1
log-bin = /data/3307/mysql-bin
expire_logs_days = 7
#________m-m m1 end________
……省略……

重啓mysql

[root@zsq 3307]# ./mysql stop
Stoping MySQL...
[root@zsq 3307]# ./mysql start
Starting MySQL...

3.2導出3307數據庫數據

mysqldump -uroot -plx3306 -S /data/3307/mysql.sock -A --events -B -F -x --master-data=1|gzip > /opt/$(date +%F).sql.gz
1)解壓並將數據導入到3306
 gzip -d 2016-06-10.sql 
 mysql -uroot -plx3306 -S /data/3306/mysql.sock < 2016-06-10.sql
 2)登陸主數據庫3306
mysql -uroot -plx3306 -S /data/3306/mysql.sock
mysql> CHANGE MASTER TO  MASTER_HOST='192.168.10.102', MASTER_USER='rep', MASTER_PORT=3307, MASTER_PASSWORD='lx123';
mysql> start slave;
3)查看從庫3306狀態
mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.179.102
                  Master_User: rep
                  Master_Port: 3307
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000007
          Read_Master_Log_Pos: 1986
               Relay_Log_File: relay-bin.000005
                Relay_Log_Pos: 728
        Relay_Master_Log_File: mysql-bin.000007
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: mysql
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 1986
              Relay_Log_Space: 921
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 3
1 row in set (0.00 sec)

ERROR: 
No query specified
4)在數據庫3306建立數據庫students

mysql -uroot -plx3306 -S /data/3306/mysql.sock
mysql> create database students;
mysql> use students;
5)建立表t1,並插入內容
mysql> CREATE TABLE `t1` (   `id` bigint(12) NOT NULL auto_increment,   `name` varchar(12) NOT NULL,   PRIMARY KEY  (`id`) );
mysql> insert into t1(name) values("oldgirl"); 
mysql> insert into t1(name) values("oldboy"); 
mysql> select * from t1;                      
+----+---------+
| id | name    |
+----+---------+
|  1 | oldgirl |
|  3 | oldboy  |
+----+---------+
結果查看到內容是按照ID號,1 3 ……進行增加
6)登陸到3307數據庫

[root@zsq opt]# mysql -uroot -plx3306 -S /data/3307/mysql.sock
mysql> use students;
mysql> select * from t1;
+----+---------+
| id | name    |
+----+---------+
|  1 | oldgirl |
|  3 | oldboy  |
+----+---------+
mysql> insert into t1(name) values("lx"); 
mysql> insert into t1(name) values("swj"); 
mysql> select * from t1;                   
+----+---------+
| id | name    |
+----+---------+
|  1 | oldgirl |
|  3 | oldboy  |
|  4 | lx      |
|  6 | swj     |
+----+---------+
4 rows in set (0.00 sec)
查看到數據庫3307的ID是按照偶數進行遞增的

7)登錄3308 查看 ,發現數據已經都同步過來了
mysql -uroot -plx3308 -S /data/3308/mysql.sock

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| amoeba_test        |
| amoeba_test1       |
| amoeba_test2       |
| mysql              |
| performance_schema |
| students           |
| test               |
+--------------------+
8 rows in set (0.00 sec)

mysql> use students;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select * from t1; 
+----+---------+
| id | name    |
+----+---------+
|  1 | oldgirl |
|  3 | oldboy  |
|  4 | lx      |
|  6 | swj     |
+----+---------+
4 rows in set (0.00 sec)

8)3308的配置文件
[root@oldboy 3308]# vim my.cnf 

[client]
port            = 3308
socket          = /data/3308/mysql.sock

[mysql]
no-auto-rehash

[mysqld]
user    = mysql
port    = 3308
socket  = /data/3308/mysql.sock
basedir = /application/mysql
datadir = /data/3308/data
open_files_limit    = 1024
back_log = 600
max_connections = 800
max_connect_errors = 3000
table_cache = 614
external-locking = FALSE
max_allowed_packet =8M
sort_buffer_size = 1M
join_buffer_size = 1M
thread_cache_size = 100
thread_concurrency = 2
query_cache_size = 2M
query_cache_limit = 1M
query_cache_min_res_unit = 2k
#default_table_type = InnoDB
thread_stack = 192K
#transaction_isolation = READ-COMMITTED
tmp_table_size = 2M
max_heap_table_size = 2M
long_query_time = 1
#log_long_format
#log-error = /data/3308/error.log
#log-slow-queries = /data/3308/slow.log
pid-file = /data/3308/mysql.pid
log-bin = /data/3308/mysql-bin
relay-log = /data/3308/relay-bin
relay-log-info-file = /data/3308/relay-log.info
binlog_cache_size = 1M
max_binlog_cache_size = 1M
max_binlog_size = 2M
expire_logs_days = 7
key_buffer_size = 16M
read_buffer_size = 1M
read_rnd_buffer_size = 1M
bulk_insert_buffer_size = 1M
#myisam_sort_buffer_size = 1M
#myisam_max_sort_file_size = 10G
#myisam_max_extra_sort_file_size = 10G
#myisam_repair_threads = 1
#myisam_recover

lower_case_table_names = 1
skip-name-resolve
slave-skip-errors = 1032,1062
replicate-ignore-db=mysql

server-id = 9

innodb_additional_mem_pool_size = 4M
innodb_buffer_pool_size = 32M
innodb_data_file_path = ibdata1:128M:autoextend
innodb_file_io_threads = 4
innodb_thread_concurrency = 8
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 2M
innodb_log_file_size = 4M
innodb_log_files_in_group = 3
innodb_max_dirty_pages_pct = 90
innodb_lock_wait_timeout = 120
innodb_file_per_table = 0
[mysqldump]
quick
max_allowed_packet = 2M

[mysqld_safe]
log-error=/data/3308/mysql_oldboy3308.err
pid-file=/data/3308/mysqld.pid
                                
View Code

3.3主從複製故障處理

1. 當從庫複製遇到錯誤時,好比報錯「要建立的數據庫已存在」

解決方案: 讓從庫跳過這一步操做,繼續執行其它的操做

方法一: 命令行實現,跳過這一步;
mysql> stop slave;
mysql> set global sql_slave_skip_counter =1;
mysql> start slave;
方法二: 配置文件中,指定忽略的錯誤;
[root@MySQL opt]# grep slave-skip /data/3308/my.cnf
slave-skip-errors = 1032,1062

4.企業場景一主多從宕機從庫切換主

(分兩種一個是數據庫宕機,一個是服務宕機)

4.1 模擬主庫宕機

root@oldboy 3307]# /data/3306/mysql stop
Stoping MySQL...
[root@oldboy 3307]# netstat -ntpl|grep 3306
登錄從庫,查看從庫的線程更新狀態
[root@oldboy 3307]# mysql -uroot -plx3308 -S /data/3308/mysql.sock

mysql> show processlist\G
*************************** 1. row ***************************
     Id: 5
   User: system user
   Host: 
     db: NULL
Command: Connect
   Time: 877066
  State: Waiting for master to send event         #IO線程
   Info: NULL
*************************** 2. row ***************************
     Id: 6
   User: system user
   Host: 
     db: NULL
Command: Connect
   Time: 3855
  State: Slave has read all relay log; waiting for the slave I/O thread to update it           #SQL線程 ,說明跟主庫複製是最新的
   Info: NULL
*************************** 3. row ***************************
     Id: 16
   User: root
   Host: localhost
     db: NULL
Command: Query
   Time: 0
  State: NULL
   Info: show processlist
3 rows in set (0.00 sec)

4.2. 查看全部slave ,看哪一個binlog大,哪一個大哪一個數據最新、
#. 半同步的狀態,就不用選了,直接就是它  (若是主庫宕機,服務還能起來,把主庫binlog補全)
[root@oldboy 3307]# cat /data/3307/data/master.info 
18
mysql-bin.000004
530740
192.168.179.102
rep
lx123
3306
60
0
0
1800.000
0
[root@oldboy 3307]# cat /data/3308/data/master.info 
18
mysql-bin.000008
107
192.168.179.102
rep
lx123
3307
60
0
0
1800.000
0
4.3. 確保全部relay log所有更新完畢
mysql> stop slave io_thread;
mysql> show processlist\G             #直到看到State: Slave has read all relay log;表示從庫更新都執行完畢
mysql> quit

4.4. 進入到數據庫目錄,刪除master.info  relay-log.info
cd /data/3308/data
[root@oldboy data]# rm -rf master.info   #relay-log有就刪除
檢查受權表,read-only等參數   # read-only防止數據寫從庫的參數 

mysql>  show grants for rep@'192.168.179.%'; 
+----------------------------------------------------------------------------------------------------------------------------+
| Grants for rep@192.168.179.%                                                                                               |
+----------------------------------------------------------------------------------------------------------------------------+
| GRANT REPLICATION SLAVE ON *.* TO 'rep'@'192.168.179.%' IDENTIFIED BY PASSWORD '*4F567C322C9F749E6278E501EC4F3E80EBF7F064' |
+----------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

4.5. 3308 提高爲主庫
log-bin = /data/3308/mysql-bin
若是存在log-slave-updates   read-only等必定註釋它。
[root@oldboy 3308]# /data/3308/mysql restart   

mysql> stop slave;
mysql> CHANGE MASTER TO  MASTER_HOST='192.168.179.102', MASTER_USER='rep', MASTER_PORT=3308, MASTER_PASSWORD='lx123';
#若是不是多實例,CHANGE MASTER TO  MASTER_HOST='192.168.179.102',  修改下IP地址便可,用戶名跟密碼是同樣的 
#若是是多實例,修過下端口
#若是不一樣步要指定位置點

4.6.修改web程序文件指向新的主庫

4.7. 修理壞的主庫,完成後做爲從庫使用
4.8. mysql 5.5以上才支持半同步半同步下的一主多從恢復,直接對設置半同步的從庫肯定爲主庫
一主多從主庫宕機經過master.info肯定新主庫
讓某一個穩定從庫和主庫徹底一致,即主庫和這個從庫更新數據完畢,在返回給用戶更新成功
優勢:
1.確保至少一個從庫和主庫數據一致
缺點:
1.主從之間網絡延遲,或者從庫有問題的時候,用戶體驗不好,固然能夠設置超時時間,10秒

4.9.從庫slave down機
恢復方法:機器宕機 從新作slave,直接灌數據
服務宕機,還能啓動服務,中止主從開關,補全binglog 開啓主從便可

5.MySQL的備份與恢復

5.1備份單個數據庫

5.1.1最基礎的備份單個數據庫

1>    語法:mysqldump –u 用戶名 –p 數據庫名> 備份的數據庫名
2>    備份nick_defailt數據庫,查看內容。
[root@localhost ~]# mysqldump -uroot -p -B nick_defailt >/opt/mysql_nick_defailt.bak
Enter password: 
[root@localhost ~]# egrep -v "#|\*|--|^$" /opt/mysql_nick_defailt.bak 
DROP TABLE IF EXISTS `oldsuo`;
CREATE TABLE `oldsuo` (
  `id` int(4) NOT NULL,
  `name` char(20) NOT NULL,
  `age` tinyint(2) NOT NULL DEFAULT '0',
  `dept` varchar(16) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
LOCK TABLES `oldsuo` WRITE;
INSERT INTO `oldsuo` VALUES (2,'索宁',0,NULL),(3,'索尼',0,NULL),(4,'底底',0,NULL);
UNLOCK TABLES;
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
  `qq` varchar(15) DEFAULT NULL,
  `id` int(4) NOT NULL AUTO_INCREMENT,
  `name` char(20) NOT NULL,
  `suo` int(4) DEFAULT NULL,
  `age` tinyint(2) NOT NULL DEFAULT '0',
  `dept` varchar(16) DEFAULT NULL,
  `sex` char(4) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `index_name` (`name`)
) ENGINE=MyISAM AUTO_INCREMENT=8 DEFAULT CHARSET=latin1;
LOCK TABLES `student` WRITE;
INSERT INTO `student` VALUES (NULL,2,'oldsuo',NULL,0,NULL,NULL),(NULL,3,'kangknag',NULL,0,NULL,NULL),(NULL,4,'kangkang',NULL,0,NULL,NULL),(NULL,5,'oldsuo',NULL,0,NULL,NULL),(NULL,6,'kangknag',NULL,0,NULL,NULL),(NULL,7,'kangkang',NULL,0,NULL,NULL);
UNLOCK TABLES;

3>    啓用壓縮備份數據庫
[root@localhost~]#mysqldump -uroot -p -B nick_defailt|gzip>/opt/mysql_nick_defailt.bak.gz
Enter password: 
[root@localhost ~]# ll /opt/
總用量 28
-rw-r--r--. 1 root root 2109 10月 24 16:36 data_bak.sq2
-rw-r--r--. 1 root root 2109 10月 24 16:36 data_bak.sql
-rw-r--r--. 1 root root 1002 10月 27 11:55 mysql_nick_defailt.bak
-rw-r--r--. 1 root root 1002 10月 27 11:56 mysql_nick_defailt.bak.gz
-rw-r--r--. 1 root root 3201 10月 27 11:46 mysql_nick_defailt_B.bak
drwxr-xr-x. 2 root root 4096 11月 22 2013 rh
-rw-r--r--. 1 root root 1396 10月 24 16:11 student_bak.sql

4>    恢復nick_defailt數據庫
[root@localhost ~]# mysql -uroot -p nick_defailt </opt/mysql_nick_defailt.bak 
Enter password:
#加-B恢復方法
[root@localhost ~]#  mysql -uroot -p  </opt/mysql_nick_defailt_B.bak               
Enter password:

5>    總結
一、    備份用-B參數。增長use db,和create database的信息。
二、    用gzip對備份的數據壓縮。

5.2備份多個數據庫

備份多個數據庫的狀況呢?
#多個數據庫名中間加空格
[root@localhost ~]# mysqldump -uroot -p -B nick_defailt oldsuo oldsuo_1|gzip>/opt/mul.sql.gz
Enter password:

5.3備份單個及多個表

那若是備份單個和多個表,怎麼辦?
1>    語法:mysqldump -u 用戶名 -p 數據庫名 表名 > 備份的文件名
[root@localhost ~]# mysqldump -uroot -p nick_defailt student >/opt/mysql_nick_defailt_student.bak
Enter password:

2>    語法:mysqldump -u 用戶名 -p 數據庫名 表名1  表名2  > 備份的文件名
[root@localhost ~]# mysqldump -uroot -p  nick_defailt student oldsuo >/opt/mysql_nick_defailt.bak        
Enter password:

5.4 mysqldump 的參數

mysqldump 的關鍵參數
一、    -B指定多個庫,增長建庫語句和use語句。
二、    --compact去掉註釋,適合調試輸出,生產不用。
三、    -A 備份全部庫。
四、    -F刷新binlog日誌。
五、    --master-data 增長binlog日誌文件名及對應的位置點。
六、    -x,--lock-all-tables 
七、    -l,--locktables
八、    -d 只備份表結構
九、    -t 只備份數據
十、   --single-transaction 適合innodb事務數據庫備份。

5.6增量恢復

重要的來了,生產環境通常是增量備份與恢復;

所謂增量,就是在原數據的基礎上繼續添加數據,沒必要每次都從新添加,省時省力。

A:增量恢復必備條件:

1.    開啓MySQL數據庫log-bin參數記錄binlog日誌。
[root@localhost 3306]# grep log-bin /data/3306/my.cnf 
log-bin = /data/3306/mysql-bin
2.    存在數據庫全備。

B:生產環境 mysqldump備份命令:

# 進行數據庫全備,(生產環境還經過定時任務每日凌晨執行)
mysqldump -uroot -pnick -S /data/3306/mysql.sock --default-character-set=gbk --single-transaction -F -B nick |gzip >/server/backup/mysql_$(date +%F).sql.gz
# innodb引擎備份
mysqldump -u$MYUSER -p$MYPASS -S $MYSOCK -F --single-transaction -A -B |gzip >$DATA_FILE
# myisam引擎備份
mysqldump -u$MYUSER -p$MYPASS -S $MYSOCK -F -A -B --lock-all-tables |gzip >$DATA_FILE

C:恢復:

# 經過防火牆禁止web等應用向主庫寫數據或者鎖表。讓主庫暫時中止更新,而後再進行恢復。
# 誤操做刪除nick庫!
1. 檢查全備及binlog日誌
[root@localhost 3306]# cd /server/backup/
[root@localhost backup]# gzip -d mysql_2015-10-31.sql.gz 
[root@localhost backup]# vim mysql_2015-10-31.sql
[root@localhost backup]# grep -i "change" mysql_2015-10-31.sql

2. 當即刷新並備份出binlog
[root@localhost 3306]# mysqladmin -uroot -pnick -S /data/3306/mysql.sock flush-logs
[root@localhost 3306]# cp /data/3306/mysql-bin.000030 /server/backup/
#誤操做log-bin,倒數第二
[root@localhost backup]# mysqlbinlog -d nick mysql-bin.000030 >bin.sql    #導出爲.sql格式。
[root@localhost backup]# vim bin.sql
找到語句drop database nick刪除!!!(誤操做語句)
3. 恢復
[root@localhost backup]# mysql -uroot -pnick -S /data/3306/mysql.sock <mysql_2015-10-31.sql        #恢復以前的數據庫全備
[root@localhost backup]# mysql -uroot -pnick -S /data/3306/mysql.sock nick < bin.sql
#恢復刪除誤操做語言的bin-log。
相關文章
相關標籤/搜索