linux系统下实现mysql热备份详细步骤(mysql主从复制)

主从的作用:

1.可以当做一种备份方式

2.用来实现读写分离,缓解一个数据库的压力

MySQL主从备份原理:

Mysql的主从复制至少是需要两个Mysql的服务,当然Mysql的服务是可以分布在不同的服务器上,也可以在一台服务器上启动多个服务。

如果想配置成为同一台上的话,注意安装的时候,选择两个不同的prefix=路径,同时开启服务器的时候,端口不能相同。

(1)首先确保主从服务器上的Mysql版本相同(做主从服务器的原则是,MYSQL版本要相同,如果不能满足,最起码从服务器的MYSQL的版本必须高于主服务器的MYSQL版本 )

(2)在主服务器上,设置一个从数据库的账户,使用REPLICATION SLAVE赋予权限,如:


代码如下:

mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave001'@'192.168.0.99' IDENTIFIED BY

'123456';

Query OK, 0 rows affected (0.13 sec)

[原理]master 上提供binlog ,

slave 通过 I/O线程从 master拿取 binlog,并复制到slave的中继日志中

slave 通过 SQL线程从 slave的中继日志中读取binlog ,然后解析到slave中

主从复制大前提

需要master与slave同步,因为笔者的数据库数据量不大,所以无需考虑太多,直接把

master上的data复制到了slave上,但是如果是大的数据量,比如像taobao这个的系统

实验环境准备:

OS: CentOS5.4

Mysql:Mysql-5.0.41.tar.gz
辅助工具:SSH Secure Shell Client

两台测试IP&服务器:


代码如下:

Master Server: 192.168.1.2/Linux CentOS5.4/MYSQL 5.0
Slave Server: 192.168.1.3/Linux CentOS5.4/MYSQL 5.0

安装配置步骤:

1、首先在Linux环境下分配好磁盘分区以便留足MySQL数据库的备份空间


代码如下:

[root@vps mysql]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/simfs 30G 2.0G 29G 7% /

2、MySQL数据库的安装:

1>将Mysql-5.0.41.tar.gz通过SSH 工具 上传到Linux系统的home目录下

2>建立MySQL使用者和群组:


代码如下:

#groupadd mysql
#useradd -g mysql mysql

3>解压缩Mysql-5.0.41.tar.gz源码包

代码如下:

#cd /usr/local/sofrware
#tar zxvf Mysql-5.0.41.tar.gz

4>进入源码目录编译安装


代码如下:

#cd /home/Mysql-5.0.41
#./configure --prefix=/usr/local/mysql --with-charset=gbk |注:配置Mysql安装路径并且支持中文
#make |注:编译
#make install |注:编译安装

5>替换/etc/my.cnf文件,进入源码包,执行命令


代码如下:

#cd /home/Mysql-5.0.41
#cp support-files/my-medium.cnf /etc/my.cnf

6>完成以上操作以后进行初始化数据库,进入已经安装好的mysql目录


代码如下:

#cd /usr/local/mysql
#bin/mysql_install_db --user=mysql |注:--user=mysql 初始化表并且规定用mysql用户

7>设置给mysql和root用户设定访问权限 我们先进入mysql目录


代码如下:

#cd /usr/local/mysql
#chown -R root /usr/local/mysql      注:设定root能访问/usr/local/mysq
#chown -R mysql /usr/local/mysql/var   注:设定mysql用户能访问/usr/local/mysql/var
#chgrp -R mysql /usr/local/mysql     注:设定mysql组能够访问/usr/local/mysq

8>启动mysql,进入已经安装好的目录


代码如下:

#cd /usr/local/mysql
#bin/mysqld_safe --user=mysql &

9>
修改mysql数据库超级用户root的缺省密码:


代码如下:

/usr/local/mysql/bin/mysqladmin -u root password 'mysql'

关闭mysql服务器


代码如下:

cd /usr/local/mysql/bin
./mysqladmin -u root -p shutdown

10>设定开机就启动mysql,进入源码目录下


代码如下:

# cd /home/Mysql-5.0.41
# cp support-files/mysql.server /etc/init.d/mysql

# chmod +x /etc/init.d/mysql
# chkconfig --level 345 mysql on
# service mysql restart
Shutting down MySQL. [ 确定 ]
Starting MySQL [ 确定 ]
[root@localhost mysql]#

到这里MySQL就装好了。

3、配置MySQL5.0的复制(Replication)功能

一.将master设置为只读。

mysql> flush tables with read lock;

二.用master中的data文件夹替换slave中的data文件夹

比如 用 tar zcvf mysql_data.gz /media/raid10/mysql/3306/data

然后 mv mysql_data.gz /media/raid10/htdocs/blog/wordpress/

因为我的 /media/raid10/htdocs/blog/wordpress/ 是 Nginx 的主目录

所以可以在 slave上,用wget下载这个文件,然后 解压,并覆盖slave上的data文件

注意:覆盖之前最好备份源文件

三.配置master的my.cnf,添加以下内容

在[mysqld]配置段添加如下字段

代码如下:

server-id=1

log-bin=/media/raid10/mysql/3306/binlog/binlog //这里写你的binlog绝对路径名

binlog-do-db=blog //需要同步的数据库,如果没有本行,即表示同步所有的数据库

binlog-ignore-db=mysql //被忽略的数据库

这里给出我的my.cnf配置文件

代码如下:

[client]

character-set-server = utf8

port = 3306

socket = /tmp/mysql.sock

[mysqld]

character-set-server = utf8

replicate-ignore-db = mysql

replicate-ignore-db = test

replicate-ignore-db = information_schema

user = mysql

port = 3306

socket = /tmp/mysql.sock

basedir = /usr/local/webserver/mysql

datadir = /media/raid10/mysql/3306/data

log-error = /media/raid10/mysql/3306/mysql_error.log

pid-file = /media/raid10/mysql/3306/mysql.pid

open_files_limit = 10240

back_log = 600

max_connections = 5000

max_connect_errors = 6000

table_cache = 614

external-locking = FALSE

max_allowed_packet = 16M

sort_buffer_size = 1M

join_buffer_size = 1M

thread_cache_size = 300

#thread_concurrency = 8

query_cache_size = 20M

query_cache_limit = 2M

query_cache_min_res_unit = 2k

default-storage-engine = MyISAM

thread_stack = 192K

transaction_isolation = READ-COMMITTED

tmp_table_size = 20M

max_heap_table_size = 20M

long_query_time = 3

log-slave-updates

log-bin = /media/raid10/mysql/3306/binlog/binlog

binlog-do-db=blog

binlog-ignore-db=mysql

binlog_cache_size = 4M

binlog_format = MIXED

max_binlog_cache_size = 8M

max_binlog_size = 20M

relay-log-index = /media/raid10/mysql/3306/relaylog/relaylog

relay-log-info-file = /media/raid10/mysql/3306/relaylog/relaylog

relay-log = /media/raid10/mysql/3306/relaylog/relaylog

expire_logs_days = 30

key_buffer_size = 10M

read_buffer_size = 1M

read_rnd_buffer_size = 6M

bulk_insert_buffer_size = 4M

myisam_sort_buffer_size = 8M

myisam_max_sort_file_size = 20M

myisam_repair_threads = 1

myisam_recover

interactive_timeout = 120

wait_timeout = 120

skip-name-resolve

#master-connect-retry = 10

slave-skip-errors = 1032,1062,126,1114,1146,1048,1396

#master-host = 192.168.1.2

#master-user = username

#master-password = password

#master-port = 3306

server-id = 1

innodb_additional_mem_pool_size = 16M

innodb_buffer_pool_size = 20M

innodb_data_file_path = ibdata1:56M:autoextend

innodb_file_io_threads = 4

innodb_thread_concurrency = 8

innodb_flush_log_at_trx_commit = 2

innodb_log_buffer_size = 16M

innodb_log_file_size = 20M

innodb_log_files_in_group = 3

innodb_max_dirty_pages_pct = 90

innodb_lock_wait_timeout = 120

innodb_file_per_table = 0

#log-slow-queries = /media/raid10/mysql/3306/slow.log

#long_query_time = 10

[mysqldump]

quick

max_allowed_packet = 32M

四.在master机上为slave机添加一同步帐号

代码如下:

mysql> grant replication slave on *.* to 'admin'@'172.29.141.115' identified by '12345678';

mysql> flush privileges ;

五.配置slave的my.cnf,添加以下内容

注意:

1.如果mysql是5.5.3-m3 的版本,只需

在[mysqld]字段下添加如下内容

server-id=2

2.如果是5.0x的版本,需要

在[mysqld]字段下添加如下内容

代码如下:

server-id=2

log-bin=mysql-bin //这是同步的binlog,具体以你的binlog为准

master-host=172.29.141.112

master-user=admin

master-password=12345678

master-port=3306

master-connect-retry=60 //如果发现主服务器断线,重新连接的时间差;

replicate-do-db=blog //同步的数据库,不写本行 表示 同步所有数据库

replicate-ignore-db=mysql //不需要备份的数据库

log-slave-update

slave-skip-errors

我的mysql是5.5.3,这里给出我的slave my.cnf配置文件

代码如下:

[client]

character-set-server = utf8

port = 3306

socket = /tmp/mysql.sock

[mysqld]

character-set-server = utf8

replicate-ignore-db = mysql

replicate-ignore-db = test

replicate-do-db = blog

replicate-ignore-db = information_schema

user = mysql

port = 3306

socket = /tmp/mysql.sock

basedir = /usr/local/webserver/mysql

datadir = /media/raid10/mysql/3306/data

log-error = /media/raid10/mysql/3306/mysql_error.log

pid-file = /media/raid10/mysql/3306/mysql.pid

open_files_limit = 10240

back_log = 600

max_connections = 5000

max_connect_errors = 6000

table_cache = 614

external-locking = FALSE

max_allowed_packet = 16M

sort_buffer_size = 1M

join_buffer_size = 1M

thread_cache_size = 300

#thread_concurrency = 8

query_cache_size = 20M

query_cache_limit = 2M

query_cache_min_res_unit = 2k

default-storage-engine = MyISAM

thread_stack = 192K

transaction_isolation = READ-COMMITTED

tmp_table_size = 20M

max_heap_table_size = 20M

long_query_time = 3

log-slave-updates

log-bin = /media/raid10/mysql/3306/binlog/binlog

binlog_cache_size = 4M

binlog_format = MIXED

max_binlog_cache_size = 8M

max_binlog_size = 20M

relay-log-index = /media/raid10/mysql/3306/relaylog/relaylog

relay-log-info-file = /media/raid10/mysql/3306/relaylog/relaylog

relay-log = /media/raid10/mysql/3306/relaylog/relaylog

expire_logs_days = 30

key_buffer_size = 10M

read_buffer_size = 1M

read_rnd_buffer_size = 6M

bulk_insert_buffer_size = 4M

myisam_sort_buffer_size = 8M

myisam_max_sort_file_size = 20M

myisam_repair_threads = 1

myisam_recover

interactive_timeout = 120

wait_timeout = 120

skip-name-resolve

#master-connect-retry = 60

slave-skip-errors = 1032,1062,126,1114,1146,1048,1396

#master-host=172.29.141.112

#master-user = admin

#master-password = 12345678

#master-port = 3306

server-id = 2

innodb_additional_mem_pool_size = 16M

innodb_buffer_pool_size = 20M

innodb_data_file_path = ibdata1:56M:autoextend

innodb_file_io_threads = 4

innodb_thread_concurrency = 8

innodb_flush_log_at_trx_commit = 2

innodb_log_buffer_size = 16M

innodb_log_file_size = 20M

innodb_log_files_in_group = 3

innodb_max_dirty_pages_pct = 90

innodb_lock_wait_timeout = 120

innodb_file_per_table = 0

#log-slow-queries = /media/raid10/mysql/3306/slow.log

#long_query_time = 10

[mysqldump]

quick

max_allowed_packet = 32M

六.通过查看master的状态(在master上查看),为配置slave做准备

代码如下:

mysql> show master status/G;

ERROR 2006 (HY000): MySQL server has gone away

No connection. Trying to reconnect...

Connection id: 13

Current database: blog

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

File: binlog.000005

Position: 592

Binlog_Do_DB: blog

Binlog_Ignore_DB: mysql

1 row in set (0.01 sec)

ERROR:

No query specified

从上面的信息,可以看出,master现在使用的binlog是binlog.000005,position是592,那么下面的slave配置必须与这个对应。

其实binlog.000005是当前master使用的binlog日志文件

position是当前master使用的binlog.000005日志文件的位置

简单理解为master正在使用哪个binlog的哪个数据行(位置)。

七.如果是5.5.3-m3版本mysql,需要启动slave后,配置与master相关对应的信息(在slave上配置)

注意,这个与第六步相对应

代码如下:

mysql> stop slave ;

mysql> change master to master_host='172.29.141.112', master_user='admin', master_password='12345678', master_log_file='binlog.000005', master_log_pos=488;
mysql> CHANGE MASTER TO MASTER_CONNECT_RETRY=60;

这个与5.0的配置my.cnf作用是一样的,配置成与master相对应的内容

主要是配置slave,让slave知道从master的哪个binlog上的哪个位置复制数据。所以需要知道master的ip,user_name,user_passwd,binlog,binlog_position以及多长时间连接一次master

八.开启slave

代码如下:

mysql> start slave;

九.解除master只读限制,并做测试

代码如下:

mysql> unlock tables;

mysql> use blog;

mysql> create longxibendi ( a int, b int );

十.从slave上查看

代码如下:

mysql> use blog;

mysql> show tables;

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

| Tables_in_blog |

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

| longxibendi |

| wp_commentmeta |

| wp_comments |

| wp_links |

| wp_options |

| wp_postmeta |

| wp_posts |

| wp_term_relationships |

| wp_term_taxonomy |

| wp_terms |

| wp_usermeta |

| wp_users |

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

12 rows in set (0.00 sec)

可以看到成功了!!

十一.配置过程中,可以用 show slave status/G; 在 slave上

查看 slave的复制情况

十二.如果出现什么问题,可能是防火墙的问题

/etc/init.d/iptables stop 关闭 master 上的防火墙,或者进行相应的配置

常遇到的错误与解决:

1.[mysql]ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

这个错误,网上有很多说法,其实直接的原因是mysql服务器没有启动

之前我按照5.0x配置master-slave,然后启动slave,在连接slave,就会报这个错误

后来发现原因是,mysql slave没有启动起来,然后去查错误日志,发现以下的字段

代码如下:

110505 01:55:20 mysqld_safe mysqld from pid file /media/raid10/mysql/3306/mysql.pid ended

110505 02:04:41 mysqld_safe Starting mysqld daemon with databases from /media/raid10/mysql/3306/data

InnoDB: The InnoDB memory heap is disabled

InnoDB: Mutexes and rw_locks use InnoDB's own implementation

110505 2:04:41 InnoDB: highest supported file format is Barracuda.

110505 2:04:41 InnoDB Plugin 1.0.6 started; log sequence number 44338

110505 2:04:41 [ERROR] /usr/local/webserver/mysql/libexec/mysqld: unknown variable 'master-connect-retry=60'

110505 2:04:41 [ERROR] Aborting

110505 2:04:41 InnoDB: Starting shutdown...

110505 2:04:43 InnoDB: Shutdown completed; log sequence number 44348

110505 2:04:43 [Note] /usr/local/webserver/mysql/libexec/mysqld: Shutdown complete

110505 02:04:43 mysqld_safe mysqld from pid file /media/raid10/mysql/3306/mysql.pid ended

110505 02:07:44 mysqld_safe Starting mysqld daemon with databases from /media/raid10/mysql/3306/data

InnoDB: The InnoDB memory heap is disabled

InnoDB: Mutexes and rw_locks use InnoDB's own implementation

110505 2:07:44 InnoDB: highest supported file format is Barracuda.

110505 2:07:45 InnoDB Plugin 1.0.6 started; log sequence number 44348

110505 2:07:45 [ERROR] /usr/local/webserver/mysql/libexec/mysqld: unknown variable 'master-host=172.29.141.112'

110505 2:07:45 [ERROR] Aborting

从上面的ERROR,知道 master-connect-retry=60这个my.cnf中的参数有问题,后来从网上搜资料,发现,mysql5.5.3-m3版本不支持这个参数,

然后我把这个参数注释掉,又发现不支持这个参数master-host,从上面的ERROR字段可以看出来。后来,就知道,5.5.3-m3不能按5.0.x那样配置

原来不需要从my.cnf中配置master相关信息,当然server-id是必须的。其他信息,通过 在命令行中 ,登陆 mysql服务器配置。

其实server-id的作用是

第一,标识,区分不同的slave,第二,防止环备份的发生

2.Last_Error: Last_SQL_Error:等错误

这个是从 slave上,运行 show slave status/G; 得到的。出现这个问题,最根本的原因是,slave 没有与当前的master的binlog 和binlog的position对应上

也就是说,slave传输的master binlog 不与当前master正使用的binlog以及binlog的行数对应。

3.[ERROR] Slave I/O: error connecting to master 'admin@172.29.141.112:3306' - retry-time: 60 retries: 86400, Error_code: 2003

这个就是因为防火墙的问题,所以用 /etc/init.d/iptables stop 关闭防火墙就OK了。

4.遇到ERROR 2013 (HY000): Lost connection to MySQL server during query错误。
在/ect/my.cnf的[mysqld]中添加skip-name-resolve

(0)

相关推荐

  • 详解MySQL实现主从复制过程

    一.什么是主从复制 将主数据库中的DDL和DML操作通过二进制日志(BINLOG)传输到从数据库上,然后将这些日志重新执行(重做):从而使得从数据库的数据与主数据库保持一致. 二.主从复制的作用 1.主数据库出现问题,可以切换到从数据库. 2.可以进行数据库层面的读写分离, 3.可以在从数据库上进行日常备份 三.复制过程 Binary log:主数据库的二进制日志 Relay log:从服务器的中继日志 第一步:master在每个事务更新数据完成之前,将该操作记录串行地写入到binlog文件中.

  • shell监控脚本实例—监控mysql主从复制

    本节内容:监控mysql主从复制的shell脚本. 说明:监控脚本在 rhel5 下测试正常,其它版本的linux 系统请自行测试,需要的一些准备工作可以查看这篇文章 代码: 复制代码 代码如下: #监控mysql 主从复制cat chk_mysql_rep.sh #!/bin/bash # #script_name:chk_mysql_rep.sh #check mysql replication # #ssh root@xen "/usr/local/mysql/bin/mysql -uro

  • MySQL主从复制配置心跳功能介绍

    在 MySQL 主从复制时,有时候会碰到这样的故障:在 Slave 上 Slave_IO_Running 和 Slave_SQL_Running 都是 Yes,Slave_SQL_Running_State 显示 Slave has read all relay log; waiting for the slave I/O thread to update it ,看起来状态都正常,但实际却滞后于主,Master_Log_File 和 Read_Master_Log_Pos 也不是实际主上最新的

  • 深入解析半同步与异步的MySQL主从复制配置

    简单来讲MySQL的主从复制就是一个C/S架构的应用.master可以认为是我们通常意义上所认为的server,slave可以当作是一台client.slave上的I/O线程去请求master上数据,而master验证通过slave的信息后就允许slave接入,然后进行数据变化信息的发送. 一.MySQL主从复制原理 这里我以MySQL5.5为例来说一下MySQL的主从复制的原理: 首先由备节点的I/O线程负责向主节点请求数据,主节点验证通过以后会由dump线程把数据发送给备用节点.备用节点的I

  • centos下mysql主从复制设置详解

    安装环境:centos 5.4 mysql版本:mysql 5.1.xx 采用rpm直接安装 所需软件: xtrabackup 1.2.22 采用rpm直接安装 1. Master:/etc/my.cnf  复制代码 代码如下: [mysqld] server-id = 1log-bin innodb_flush_log_at_trx_commit=1 sync_binlog=1 datadir=/var/lib/mysql character-set-server=utf8 init_conn

  • Mysql主从复制(master-slave)实际操作案例

    在这一章节里, 我们来了解下如何在 Mysql 中进行用户授权及主从复制   这里先来了解下 Mysql 主从复制的优点:   1. 如果主服务器出现问题, 可以快速切换到从服务器提供的服务 2. 可以在从服务器上执行查询操作, 降低主服务器的访问压力 3. 可以在从服务器上执行备份, 以避免备份期间影响主服务器的服务 注意一般只有更新不频繁的数据或者对实时性要求不高的数据可以通过从服务器查询, 实时性要求高的数据仍然需要从主数据库获得   在这里我们首先得完成用户授权, 目的是为了给从服务器有

  • MySQL主从复制的原理及配置方法(比较详细)

    一.复制的原理 MySQL 复制基于主服务器在二进制日志中跟踪所有对数据库的更改(更新.删除等等).每个从服务器从主服务器接收主服务器已经记录到其二进制日志的保存的更新,以便从服务器可以对其数据拷贝执行相同的更新. 将主服务器的数据拷贝到从服务器的一个途径是使用LOAD DATA FROM MASTER语句.请注意LOAD DATA FROM MASTER目前只在所有表使用MyISAM存储引擎的主服务器上工作.并且,该语句将获得全局读锁定. MySQL 使用3个线程来执行复制功能,其中1个在主服

  • MySQL数据库InnoDB引擎主从复制同步经验总结

    近期将公司的MySQL架构升级了,由原先的一主多从换成了DRBD+Heartbeat双主多从,正好手上有一个电子商务网站新项目也要上线了,用的是DRBD+Heartbeat双主一从,由于此过程还是有别于以前的MyISAM引擎的,所以这里也将其心得归纳总结了一下: 1)MySQL的replication过程是一个异步同步的过程,并非完全的主从同步,所以同步的过程中是有延迟的,如果做了读写分离的业务的话,建议也要监控此延迟时间: 2)MySQL的master与slave机器记得server-id要保

  • mysql5.6 主从复制同步详细配置(图文)

    环境:Centos 6.5 mysql5.6 采用的是虚拟机环境 master ip:192.168.17.140 slaver ip:192.168.17.141 下面开始配置: master的配置: 1.注意下图的箭头: 2:重新启动mysql服务 shell: service mysqld restart 3.看下图: 命令如下: mysql -u root -p grant replication slave,replication client on *.* to 'root'@'19

  • MySQL的主从复制步骤详解及常见错误解决方法

    mysql主从复制(replication同步)现在企业用的比较多,也很成熟.它有以下优点: 1.降低主服务器压力,可在从库上执行查询工作. 2.在从库上进行备份,避免影响主服务器服务. 3.当主库出现问题时,可以切换到从库上. 不过,用它做备份时就会也有弊端,如果主库有误操作的话,从库也会收到命令. 下面直接进入操作.这里使用的是debian5操作系统,mysql5.0,默认引擎innodb 10.1.1.45 主库 10.1.1.43 从库 1.设置主库 1)修改主库my.cnf,这里主要是

随机推荐