-- mysql 数据库备份和恢复 备份策略: 1,数据库可以关的情况下或者把表全部锁住,直接使用系统的cp命令去拷 (但象oracle这种数据库,关闭的话是可以cp,但如果不关闭只是锁表的话,是不可以cp,除非锁数据文件头) mysql如果是online的情况,但没有写操作,也可以直接cp mysql如果是online的情况,但是一个繁忙的数据,正在大量读写,这个时候就不要去cp了 冷备 offline 热备 online 2,sql语法备份导出 用于辅助备份 (数据的逻辑导入导出) 3,mysqldump备份数据库 中小型数据库 无论何种存储引擎 备出来的是sql语句,速度较慢,也无法做增量备份和累计增量备份 4,mysqlhotcopy 备份数据库, 只能是myisam引擎 适合中小型myisam引擎数据库 5,使用二进制日志恢复 6,对innodb的备份,innodb引擎的大数据使用mysqldump备份太慢,mysqlhotcopy又不能备份innodb引擎的数据。可以选用mysql自带的企业级备份工具mysql enterprise backup,或者是xtrabackup开源备份工具(可以实现增量备份和累计增量备份) 7,做mysqlAB复制实现实时备份 8,存储层的备份,如lvm(logical volumn management)快照 =========================================================== 1,冷备 (不推荐) 数据库可以关闭的情况下的备份 1,关闭数据库 cp -a 源数据文件 目标数据文件 2,打开数据库 热备 数据库不可以关闭的情况下的备份 --------------------------------- 2,sql语法备份 backup table 原理是先锁表,然后拷贝数据文件,拷.frm和.MYD,不拷 .MYI索引文件,最后再解锁 --只限MYISAM存储引擎 [root@li ~]# mkdir /tmp/mysqlbackup --建立一个存放备份的目录 [root@li ~]# chown mysql.mysql /tmp/mysqlbackup/ --改权限 --backup table的这种方式在5.6的版本里已经没有了 mysql> backup table emp to '/tmp/mysqlbackup'; --备份emp表到/tmp/mysqlbackup目录 +------------+--------+----------+----------+ | Table | Op | Msg_type | Msg_text | +------------+--------+----------+----------+ | source.emp | backup | status | OK | +------------+--------+----------+----------+ [root@li ~]# ll /tmp/mysqlbackup/ --查看时只有.frm和.MYD文件 -rw-rw---- 1 mysql mysql 8690 08-14 15:32 emp.frm -rw-rw---- 1 mysql mysql 512 08-14 15:32 emp.MYD mysql> restore table emp from '/tmp/mysqlbackup'; --误删表后恢复emp表 +------------+---------+----------+----------+ | Table | Op | Msg_type | Msg_text | +------------+---------+----------+----------+ | source.emp | restore | status | OK | +------------+---------+----------+----------+ # vim backup_table.sh --把backup table写成脚本来做 #!/bin/bash /usr/local/mysql/bin/mysql -p123 < select ename,sal into outfile '/tmp/mysqlbackup/emp_ename_sal.txt' from emp; --把emp表的ename,sal两列数据导出(备份) 实例1:把aaa库的emp表导出成文本,然后误删掉数据后进行恢复 mysql> select * into outfile '/tmp/mysqlbackup/emp.txt' from emp; --导出来的emp.txt默认都是以制表符来分隔的 两个方法: mysql> load data local infile .... --编译时要加上--enable-local-infile参数 # mysqlimport 它就是一个load data local infile的一个功能的打包实现 先delete或者truncate删除表的内容来模拟数据误删除 恢复方法一: mysql> use aaa; mysql> load data local infile '/tmp/mysqlbackup/emp.txt' into table emp; --此方法需要你在编译时加上--enable-local-infile这个编译参数才支持。但实际环境我不太建议加上此参数,因为可以完全使用方法二来替代 恢复方法二: # /usr/local/mysql/bin/mysqlimport aaa /tmp/mysqlbackup/emp.txt -p123 --这条命令aaa是库(schema)名,但没有指定表名,是由文件名来决定的(emp.txt决定了是aaa.emp表) 练习:创建一个表,把你系统里的/etc/passwd导入到数据库 mysql> use aaa; mysql> create table password ( -> username varchar(30), -> password char(1), -> uid int(5), -> gid int(5), -> comment varchar(50), -> homedir varchar(36), -> shell varchar(20)); mysql> desc password; +----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------+------+-----+---------+-------+ | username | varchar(30) | YES | | NULL | | | password | char(1) | YES | | NULL | | | uid | int(5) | YES | | NULL | | | gid | int(5) | YES | | NULL | | | comment | varchar(50) | YES | | NULL | | | homedir | varchar(36) | YES | | NULL | | | shell | varchar(20) | YES | | NULL | | +----------+-------------+------+-----+---------+-------+ 然后导入的话,有两种方法: 方法一:先用awk或sed等对/etc/passwd处理出一个新的文件,七列之间以制表符为分隔符(\t),然后用上面的mysqlimport或load data local infile来导入 # sed -r 's/:/\t/g' /etc/passwd > /etc/password 方法二:直接用mysqlimport指定分隔符 # cp /etc/passwd /etc/password --因为表名和文件名不一致,所以拷一份 # /usr/local/mysql/bin/mysqlimport aaa -p123 --fields-terminated-by=":" --lines-terminated-by="\n" /etc/password \n 代表linux系统回车键的行结束符号 windows默认为\r\n 可以使用下面的命令互相转换 dos2unix unix2dos ======================================= 用文本或数据库的方式来查找a用户的uid [root@li ~]# grep ^a: /etc/passwd |cut -d":" -f3 502 [root@li ~]# awk -F: '$1=="a" {print $3}' /etc/passwd 502 mysql> select uid from password where username='a'; +------+ | uid | +------+ | 502 | +------+ 1 row in set (0.00 sec) --从上面可以看到数据库和文本都是一种存放数据的方式,你都可以用不同的方式对它们进行读写 --但把数据放到数据库,有太多比放到文本里的优势; --那么在这个基础上,程序数据(如网站的用户数据,银行的用户数据,网游数据等)放到数据库里方便读写和管理 --我们也可以把一些系统管理的东西(如脚本处理的数据放到数据库) 练习:(要求用文本和数据库两种方式来做) 1,把系统里用户登录信息存放到数据库里 用户名 时间 from where user1 2015-08-01 10:55:30 10.1.1.35 mysql> create table login ( -> username varchar(30), -> date date, -> time time, -> clientip varchar(15)); Query OK, 0 rows affected (0.06 sec) mysql> desc login; +----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------+------+-----+---------+-------+ | username | varchar(30) | YES | | NULL | | | date | date | YES | | NULL | | | time | time | YES | | NULL | | | clientip | varchar(15) | YES | | NULL | | +----------+-------------+------+-----+---------+-------+ # vim /tmp/user_login_mysql.sh #!/bin/bash clientip=`last |head -1 |awk '{print $3}'` if [ $clientip = ":0" -o $clientip = ":0.0" ];then clientip=local fi /usr/local/mysql/bin/mysql -u root -p123 </dev/null insert into aaa.login values('$USER',current_date(),current_time(),'$clientip'); EOF # chmod 755 /tmp/user_login_mysql.sh --给执行权限 # vim /etc/profile --在最后加上执行这个脚本的一句就可以了 sh /tmp/user_login_mysql.sh 2,把本月的apache访问日志进行脚本处理,然后放到数据库里,查找出类似于被访问最多的top的页面,访问最多的top10IP等 ======================================================================== 3,mysqldump工具备份 导出的是sql语句文件 mysqldump客户端可用来转储数据库或搜集数据库进行备份或将数据转移到另一个SQL服务器(不一定是一个MySQL服务器)。转储包含创建表和/或装载表的SQL语句。 如果你在服务器上进行备份,并且表均为MyISAM表,应考虑使用mysqlhotcopy,因为可以更快地进行备份和恢复 优点: 无论是什么存储引擎,都可以用mysqldump备成sql语句 缺点: 速度较慢,导入时可能会出现格式不兼容的突发状况.无法做增量备份和累计增量备份 提供三种级别的备份,表级,库级和全库级 shell> mysqldump [options] db_name [tables] shell> mysqldump [options] --databases DB1 [DB2 DB3...] shell> mysqldump [options] --all-databases 表级备份: [root@li ~]# /usr/local/mysql/bin/mysqldump -p123 aaa emp> /tmp/mysqlbackup/emp.sql 表级恢复: [root@li ~]# /usr/local/mysql/bin/mysql -p123 aaa < /tmp/mysqlbackup/emp.sql mysql> source /tmp/mysqlbackup/emp.sql --或者在mysql数据库内使用source命令来执行外部的sql文件 库级备份: [root@li ~]# /usr/local/mysql/bin/mysqldump -p123 --databases aaa > /tmp/mysqlbackup/aaa.sql 库级恢复: [root@li ~]# /usr/local/mysql/bin/mysql -p123 < /tmp/mysqlbackup/aaa.sql 全库级备份: [root@li ~]# /usr/local/mysql/bin/mysqldump -p123 --all-databases > /tmp/mysqlbackup/all.sql 全库恢复演示: --注意mysqldump的恢复速度较慢,所以数据太大需要的时间较长 rm /mysqldata56/* -rf --这样删除数据是需要初始化的 恢复步骤: 1,初始化 /usr/local/mysql/scripts/mysql_install_db --datadir=/mysqldata56 --user=mysql --basedir=/usr/local/mysql 2,把数据库先启起来 3,恢复# /usr/local/mysql/bin/mysql < /tmp/mysqlbackup/all.sql --注意,这样恢复完后,密码还是为空,因为是误删了所有数据(包括权限表),重新初始化回的权限表,而mysqldump恢复的只有初始化之后的数据 ============================== 4,mysqlhotcopy 是一个perl写的程序,原理先锁表,再拷,再解锁。只适用于myisam存储引擎 mysqlhotcopy是一个Perl脚本,最初由Tim Bunce编写并提供。它使用LOCK TABLES、FLUSH TABLES和cp或scp来快速备份数据库。它是备份数据库或单个表的最快的途径,但它只能运行在数据库目录所在的机器上。mysqlhotcopy只用于备份MyISAM。它运行在Unix和NetWare中。 shell> mysqlhotcopy db_name [/path/to/new_directory] shell> mysqlhotcopy db_name_1 ... db_name_n /path/to/new_directory 备份给定数据库中的匹配正则表达式的表: shell> mysqlhotcopy db_name./regex/ 加上发音符(‘~’)前缀,表名的正则表达式可以被否定: shell> mysqlhotcopy db_name./~regex/ perldoc mysqlhotcopy --用此命令去查看帮助文件 备份库 [root@li ~]# /usr/local/mysql/bin/mysqlhotcopy -p 123 --socket=/var/run/mysqld/mysql5.socket source /tmp/mysqlbackup/ 恢复: 拷回去就可以了,包括了db.opt文件 备份表 [root@li ~]# /usr/local/mysql/bin/mysqlhotcopy -p 123 --socket=/var/run/mysqld/mysql5.socket source./emp/ /tmp/mysqlbackup/ --注意: -p 和密码中间要空格 他备份的文件,也有库的目录,也有db.opt文件 恢复: mysql> restore table emp from '/tmp/mysqlbackup/source'; ============================================================= innodb存储引擎的快速在线热备份 --使用mysql企业级备份工具(还有一种开源的xtrabackup) 文档:http://dev.mysql.com/doc/mysql-enterprise-backup/3.9/en/intro.html 安装包 笔记目录下/mysql/mysql_soft/V39526-01.zip --3.9版 第一步:软件包安装 mkdir /usr/local/meb unzip V39526-01.zip -d /usr/local/meb/ cd /usr/local/meb/ tar xf meb-3.9.0-el6-x86-64bit.tar.gz cd meb-3.9.0-el6-x86-64bit mv meb-3.9.0-el6-x86-64bit/* . [root@li meb]# pwd /usr/local/meb # ls /usr/local/meb/bin/mysqlbackup --备份工具现在就综合到这一个命令里了;这个命令的路径你可以加到$PATH里或者拷贝到/bin下,再或者做一个软链接到/bin /usr/local/meb/bin/mysqlbackup # ln -s /usr/local/meb/bin/mysqlbackup /usr/bin/mysqlbackup # ls /usr/local/meb/manual.html --自带的文档 /usr/local/meb/manual.html 第二步:备份前的准备(我这里没有实际生产库,只能模拟一些数据) 以rpm版mysql为例 # rm /var/lib/mysql/* -rf vim /etc/my.cnf --在[mysqld]参数组下先加上下面的参数 log-bin=mysql-bin innodb_data_home_dir=/var/lib/mysql innodb_data_file_path=ibdata1:10M:autoextend innodb_log_group_home_dir=/var/lib/mysql innodb_log_files_in_group=2 innodb_log_file_size=5242880 # /etc/init.d/mysqld restart --下面进入数据库,创建几个不同engine的表,模拟数据库的数据 # mysql mysql> create database innodb; mysql> use innodb mysql> create table aaa (id int,name varchar(20)) engine=innodb; mysql> insert into aaa values (1,'sfsfsadf'); mysql> insert into aaa select * from aaa; --不断地重复这句,使这张innodb的表很大 mysql> insert into aaa select * from aaa; Query OK, 2097152 rows affected (43.36 sec) Records: 2097152 Duplicates: 0 Warnings: 0 mysql> select count(*) from aaa; +----------+ | count(*) | +----------+ | 4194304 | +----------+ --主要是要上面这个大的innodb的表,你也可以再去创建几个其它不同引擎的表(为了模拟并验证mysqlbackup工具可以备份任何引擎) --准备一个备份目录 [root@li bin]# mkdir /tmp/mysqlbackup [root@li bin]# chown mysql.mysql /tmp/mysqlbackup/ 第三步:使用mysqlbackup命令实现mysql数据库的全备(无论什么引擎都可以) --可以使用下面的命令来对你的mysql做全备 参数说明: socket指定你本地的哪个mysql user指定用户名,我这里是使用root@localhost管理员用户,如果使用普通用户的话还需要对其授权 password指定登录用户的密码 backup-dir指定备份的目录,这里可以使用类似`date +%F`这样的来以时间命令备份 backup-and-apply-log指定备份并应用日志,应用日志的目的就是可以直接用来恢复 # mysqlbackup --socket=/var/lib/mysql/mysql.sock --user=root --password=123 --backup-dir=/tmp/mysqlbackup/`date +%F` backup-and-apply-log --全备完后的信息,下面两个信息有用 一个信息是二进制日志的位置,用于恢复备份后做二进制日志恢复 第二个信息是END LSN号,它用于增量备份时所接的编号 150801 14:29:13 mysqlbackup: INFO: MySQL binlog position: filename mysql-bin.000003, position 10971 ------------------------------------------------------------- Parameters Summary ------------------------------------------------------------- Start LSN : 522485760 End LSN : 522488053 ------------------------------------------------------------- 上面的编号是在备份日志里,如果不记得,可以在备份目录里的文件找到;如下 # cat /tmp/mysqlbackup/2015-08-01/meta/backup_variables.txt 第四步: 下面要模拟增量差异备份,所以要去数据里再建一张表来模拟数据的改变 mysql> use innodb; mysql> create table bbb (id int) engine=innodb; mysql> insert into bbb values (1); mysql> insert into bbb select * from bbb; --再次重复这条命令,让bbb表有一定的大小 mysql> select count(*) from bbb; +----------+ | count(*) | +----------+ | 524288 | +----------+ 增量差异备份的命令如下: 参数介绍 incremental表示做的是增量差异备份,不是全备 start-lsn是表示从上一次备份的哪个编号开始进行差异增量备份 backup表示只备份,没有去apply-log # mysqlbackup --socket=/var/lib/mysql/mysql.sock --user=root --password=123 --incremental --start-lsn=522488053 --incremental-backup-dir=/tmp/mysqlbackup/incre-`date +%F` backup 第五步: 下一步,再建一个小表ccc,模拟数据库在差异增量备份之后的改变 mysql> use innodb; mysql> create table ccc (id int) engine=innodb; mysql> insert into ccc values (1); mysql> insert into ccc values (2); mysql> insert into ccc values (3); mysql> insert into ccc values (4); mysql> insert into ccc values (5); 第六步:模拟数据库挂掉,用备份实现恢复 ccc表还没有来得及备份,然后数据库数据全丢了,我们这里模拟的话不要删掉数据,因为我们要保存二进制日志,所以下面我只是把数据移到另一个地方来模拟 # mv /var/lib/mysql /var/lib/mysqlbak # mkdir /var/lib/mysql 恢复的话在这里有两个步骤: 1,apply-log 2, copy-back 恢复步骤一: 先在全备里去执行apply-log操作,但是因为我们已经在前面的备份时用了backup-and-apply-log参数,所以apply-log不需要再做了 如果你在备份时没有使用backup-and-apply-log参数,而是使用backup参数,就需要 mysqlbackup --backup-dir=/全备的目录路径/ apply-log 恢复步骤二: mysqlbackup --user=root --password=123 --incremental-backup-dir=/tmp/mysqlbackup/incre-2015-08-01/ --backup-dir=/tmp/mysqlbackup/2015-08-01/ apply-incremental-backup 如果有多个增量备份,则按照增量一,增量二,增量三...这样的顺序全部应用到全备里 恢复步骤三: mysqlbackup --defaults-file=/etc/my.cnf --backup-dir=/tmp/mysqlbackup/2015-08-01/ copy-back --user=root --password=123 这样就能恢复到你的最后一次备份的状态 但这里有个小问题,你是root用户去操作的,所以权限都是root的,不是mysql的,还要用下面的命令改一下权限 # chown mysql.mysql /var/lib/mysql -R # /etc/init.d/mysqld restart --启动数据库去验证,会看到aaa和bbb表 备份之后的数据只能通过二进制日志来恢复 但是从哪开始恢复呢? 虽然在备份时的日志里有告诉我们他备到了哪个二进制日志的位置,但是现在不记得了 可以去找最后一次备份的里的文件去查 路径为/最后一次备份的目录/meta/backup_variables.txt 以我这次实验为例,如下 # cat /tmp/mysqlbackup/incre-2015-08-01/meta/backup_variables.txt |grep binlog binlog_position=mysql-bin.000003:22334 找到的恢复的位置,就可以使用下面的命令来恢复了 # mysqlbinlog --start-position=22334 /var/lib/mysqlbak/mysql-bin.000003 | mysql -p123 到此,恢复结束,数据零丢失 --最后考虑一个问题,如果要设计一个周期性的备份策略(有全备和增量备份),脚本如何写? 1 2 3 4 5 6 7 星期几 全 增 增 累(1-4) 增 增 累(4-7) 按lsn号来做 周一: mysqlbackup --socket=/var/lib/mysql/mysql.sock --user=root --password=123 --backup-dir=/tmp/mysqlbackup/`date +%F` backup-and-apply-log &>/dev/null 周二,三,五,六: lastday=`date -d "-1 days" +%F' lastlsn=`cat /tmp/mysqlbackup/$lastday/meta/backup_variables.txt |grep ^end_lsn|cut -d"=" -f2` mysqlbackup --socket=/var/lib/mysql/mysql.sock --user=root --password=123 --incremental --start-lsn=$lastlsn --incremental-backup-dir=/tmp/mysqlbackup/`date +%F` backup &>/dev/null 周四,天: lastday=`date -d "-3 days" +%F' lastlsn=`cat /tmp/mysqlbackup/$lastday/meta/backup_variables.txt |grep ^end_lsn|cut -d"=" -f2` mysqlbackup --socket=/var/lib/mysql/mysql.sock --user=root --password=123 --incremental --start-lsn=$lastlsn --incremental-backup-dir=/tmp/mysqlbackup/`date +%F` backup &>/dev/null -------------------------------- 按定义上一次备份目录和当前备份目录差异的做法: 第一天: vim /path/1.sh #!/bin/bash /path/mysqlbackup --socket=/var/lib/mysql/mysql.sock --user=root --password=123 --backup-dir=/tmp/mysqlbackup/`date +%F` backup-and-apply-log &> /dev/null 第二天和第三天和第五天和第六天(都是减1天,一样,所以用同一个脚本): vim /path/2.sh #!/bin/bash /path/mysqlbackup --socket=/var/lib/mysql/mysql.sock --user=root --password=123 --incremental --incremental-base=dir:/tmp/mysqlbackup/`date -d '-1 days' +%F` --incremental-backup-dir=/tmp/mysqlbackup/`date +%F` backup &>/dev/null 第四天和第七天(都是减3天,一样,所有用同一个脚本): vim /path/3.sh #!/bin/bash /path/mysqlbackup --socket=/var/lib/mysql/mysql.sock --user=root --password=123 --incremental --incremental-base=dir:/tmp/mysqlbackup/`date -d '-3 days' +%F` --incremental-backup-dir=/tmp/mysqlbackup/`date +%F` backup &>/dev/null 然后把上面写到crontab里 01 2 * * 1 sh /path/1.sh 01 2 * * 2,3,5,6 sh /path/2.sh 01 2 * * 4,7 sh /path/3.sh ---------------------------------- 或者把上面写成一个脚本 vim /path/4.sh #!/bin/bash day=`date +%A` case "$day" in Monday ) /path/mysqlbackup --socket=/var/lib/mysql/mysql.sock --user=root --password=123 --backup-dir=/tmp/mysqlbackup/`date +%F` backup-and-apply-log &> /dev/null ;; Tuesday|Wednesday|Friday|Saturday ) /path/mysqlbackup --socket=/var/lib/mysql/mysql.sock --user=root --password=123 --incremental --incremental-base=dir:/tmp/mysqlbackup/`date -d '-1 days' +%F` --incremental-backup-dir=/tmp/mysqlbackup/`date +%F` backup &>/dev/null ;; Thursday|Sunday ) /path/mysqlbackup --socket=/var/lib/mysql/mysql.sock --user=root --password=123 --incremental --incremental-base=dir:/tmp/mysqlbackup/`date -d '-3 days' +%F` --incremental-backup-dir=/tmp/mysqlbackup/`date +%F` backup &>/dev/null ;; * ) echo "日期有误" esac 然后把这一个脚本加入crontab 01 2 * * * sh /path/4.sh ================================================================== mysql - ndb cluster集群 同读同写 ndb cluster 是一个基于ndbcluster存储引擎的分布式数据库系统 和oracle RAC集群不同的是,ndb cluster是一种share nothing的架构,各个mysql server之间并不共享任何数据,高度可扩展性和可用性。 三种节点: 1,sql层的sql节点 它主要负责sql解析,执行计划,sql优化,cache管理等。就相当于是一个没有存储引擎的mysql服务器。 启动方式和平时一样,主要是要加上ndbcluster参数去支持ndb cluster集群; 2,ndb数据节点 每个data节点上都保存完整的一个数据分片。data节点被组织成了一个ndb group; 3,管理节点 负责整个集群的各个节点的管理工作,包括集群的启动,关闭等; 管理节点会获取整个集群环境中的各节点的状态信息和错误信息,并反馈给所有节点。也就是说起到了沟通作用, 管理节点在集群配置过程中,是最先启动的节点; manager 10.1.1.35 | | | | data node data node 10.1.1.6 10.1.1.7 | | sql node sql node 10.1.1.6 10.1.1.7 在rhel6.5下,使用mysql-cluster-gpl-7.2.8-linux2.6-x86_64.tar.gz --这是一个64位的二进制版(非源码版本) 准备三台机器 1,主机名三步 2,时间同步 3,iptables,selinux关闭 第一大步,安装和配置管理节点 1,对于MGM(管理)节点,可以不需要安装mysqld可执行文件,仅需安装用于MGM服务器和客户端的二进制文件 --因为我要安装到/usr/local/mysql,所以以前安装的数据不希望删掉的话,你可以先mv一下 mv /usr/local/mysql /usr/local/mysqlbak # tar xf mysql-cluster-gpl-7.2.8-linux2.6-x86_64.tar.gz -C /usr/local/ # mv /usr/local/mysql-cluster-gpl-7.2.8-linux2.6-x86_64/ /usr/local/mysql --管理节点需要的两个命令路径如下: /usr/local/mysql/bin/ndb_mgm /usr/local/mysql/bin/ndb_mgmd 2,配置管理节点 # /usr/local/mysql/bin/ndb_mgmd --help # vim /etc/config.ini --手动编写管理节点配置文件 [ndbd default] noofreplicas=2 datamemory=80M indexmemory=18M [ndb_mgmd] nodeid=1 hostname=10.1.1.35 datadir=/data-cluster [ndbd] nodeid=2 hostname=10.1.1.6 datadir=/data-cluster [ndbd] nodeid=3 hostname=10.1.1.7 datadir=/data-cluster [mysqld] hostname=10.1.1.6 [mysqld] hostname=10.1.1.7 # mkdir /data-cluster --写好配置后,创建配置文件里指定的管理节点的数据目录(这个不目录不存放数据库的数据,只存放管理节点的日志记录) 3,启动管理节点 # /usr/local/mysql/bin/ndb_mgmd -f /etc/config.ini MySQL Cluster Management Server mysql-5.5.27 ndb-7.2.8 # /usr/local/mysql/bin/ndb_mgm --连接上去 -- NDB Cluster -- Management Client -- ndb_mgm> show --用show查看状态,看到数据和SQL结点都没有连接 Connected to Management Server at: localhost:1186 Cluster Configuration --------------------- [ndbd(NDB)] 2 node(s) id=2 (not connected, accepting connect from 10.1.1.6) id=3 (not connected, accepting connect from 10.1.1.7) [ndb_mgmd(MGM)] 1 node(s) id=1 @10.1.1.35 (mysql-5.5.27 ndb-7.2.8) [mysqld(API)] 2 node(s) id=4 (not connected, accepting connect from 10.1.1.6) id=5 (not connected, accepting connect from 10.1.1.7) 第二步: 配置数据节点 以下的操作在所有数据节点上都要做 1,安装 # tar xf mysql-cluster-gpl-7.2.8-linux2.6-x86_64.tar.gz -C /usr/local/ # mv /usr/local/mysql-cluster-gpl-7.2.8-linux2.6-x86_64/ /usr/local/mysql 2,写一个配置文件 # mkdir /usr/local/mysql/etc # vim /usr/local/mysql/etc/my.cnf [mysqld] port=3306 datadir=/data-cluster --数据目录和管理节点里的config.ini文件里对应 pid-file=/usr/local/mysql/mysql-cluster.pid socket=/usr/local/mysql/mysql-cluster.socket ndbcluster --加上这句支持ndbcluster引擎 user=mysql [client] socket=/usr/local/mysql/mysql-cluster.socket [mysql_cluster] ndb-connectstring=10.1.1.35 3,把配置文件里写的相关目录建立,并修改相应的权限 # mkdir /data-cluster # chown mysql.mysql /data-cluster /usr/local/mysql/ -R --如果你没有安装rpm版mysql,是没有mysql用户的,先建立mysql用户,再改 --你可以使用下面的命令来建立mysql用户 # useradd -d /dev/null -s /sbin/nologin mysql 或者 useradd -u 27 -r mysql 4,数据初始化 # /usr/local/mysql/scripts/mysql_install_db --datadir=/data-cluster/ --basedir=/usr/local/mysql/ --user=mysql 5,初始化后,数据节点启动 # /usr/local/mysql/bin/ndbd --defaults-file=/usr/local/mysql/etc/my.cnf --initial 2013-03-09 11:52:18 [ndbd] INFO -- Angel connected to '10.1.1.35:1186' 2013-03-09 11:52:18 [ndbd] INFO -- Angel allocated nodeid: 2 数据节点启动后,ps -ef |grep ndbd可以看到两个进程,在管理节点上show一下可以看到两个数据节点连上,表示OK --------------------------------------------- 第三大步: 配置和启动sql节点 1,配置sql节点配置文件(和数据节点一样) 因为我这里是把data节点和sql节点配置在一起,所以上面做数据节点就已经把sql节点同时也配置好了 2,启动sql节点 # /usr/local/mysql/bin/mysqld_safe --defaults-file=/usr/local/mysql/etc/my.cnf & --rhel6里的iptables要关闭,默认它会拒绝sql节点的连接 ------------------------------------------------- 第四步: 验证 ls /data-cluster/ 可以看到管理结点这里只有日志文件 data结点才有数据 登录两个sql结点 /usr/local/mysql/bin/mysql 一边create database aaa; 另一边可以看到 一边create table bbb (id int); 另一边看不到,因为引擎要改为ndbcluster,所以 create table ccc (id int) engine=ndbcluster; --这样指定为ndb引擎的表 对于已经存在并且不是ndb引擎的表,要alter table bbb engine=ndbcluster;就可以解决 要彻底解决,要在sql节点的/usr/local/mysql/etc/my.cnf的 [mysqld] default-storage-engine=ndbcluster --加上这句后并重启mysql 得到的结果是两边同读同写, 无论哪边写的数据,另一边都可以看到 关闭ndb集群的方法: 在管理节点上做下列操作: # /usr/local/mysql/bin/ndb_mgm -e shutdown --这样就可以关闭管理节点和存储节点 SQL节点还可以连接,可以show databases; 但不能对相关的表进行读写操作了