本章內容:mysql
咱們爲何要用主從複製?web
主從複製目的:sql
能夠作數據庫的實時備份,保證數據的完整性;數據庫
可作讀寫分離,主服務器只管寫,從服務器只管讀,這樣能夠提高總體性能。vim
原理圖:服務器
mysql多實例一鍵主從同步,3306同步到3307網絡
注意:併發
檢查主從配置文件server-id跟log-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
[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"
[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
[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"
[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
[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)
因爲前一次咱們只配置了主庫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數據庫密碼
[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。
sed -i 's@#log-bin = /data/3307/mysql-bin@log-bin = /data/3307/mysql-bin@g' /data/3307/my.cnf
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
mysql> show variables like "log_slave_updates"; +-------------------+-------+ | Variable_name | Value | +-------------------+-------+ | log_slave_updates | ON | +-------------------+-------+ 1 row in set (0.00 sec)
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;
cd /opt/ gzip -d zsq.sql.gz mysql -uroot -pzsq3308 -S /data/3308/mysql.sock <zsq.sql
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
使用此種方法也能快速查看從庫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
[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級聯複製配置完畢
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
應用場景:高併發場景,使用雙主雙寫,慎用!
注意: ID會衝突
解決 ID 衝突問題
方法一: 表的id自增,讓主A 寫1,3,5;主B 寫2,4,6;
方法二:表的id不自增,經過web端程序去seq取id,寫入雙主。
環境:主庫3306 ,從庫 3307
因爲咱們已經作了主庫3306到從庫3307,如今咱們須要將從庫3307變爲主庫,將3306做爲從庫
具體操做步驟:
[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...
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
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
(分兩種一個是數據庫宕機,一個是服務宕機)
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 開啓主從便可
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對備份的數據壓縮。
備份多個數據庫的狀況呢? #多個數據庫名中間加空格 [root@localhost ~]# mysqldump -uroot -p -B nick_defailt oldsuo oldsuo_1|gzip>/opt/mul.sql.gz Enter password:
那若是備份單個和多個表,怎麼辦? 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:
mysqldump 的關鍵參數 一、 -B指定多個庫,增長建庫語句和use語句。 二、 --compact去掉註釋,適合調試輸出,生產不用。 三、 -A 備份全部庫。 四、 -F刷新binlog日誌。 五、 --master-data 增長binlog日誌文件名及對應的位置點。 六、 -x,--lock-all-tables 七、 -l,--locktables 八、 -d 只備份表結構 九、 -t 只備份數據 十、 --single-transaction 適合innodb事務數據庫備份。
重要的來了,生產環境通常是增量備份與恢復;
所謂增量,就是在原數據的基礎上繼續添加數據,沒必要每次都從新添加,省時省力。
1. 開啓MySQL數據庫log-bin參數記錄binlog日誌。 [root@localhost 3306]# grep log-bin /data/3306/my.cnf log-bin = /data/3306/mysql-bin 2. 存在數據庫全備。
# 進行數據庫全備,(生產環境還經過定時任務每日凌晨執行) 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
# 經過防火牆禁止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。