备注:如果你有时间你应该阅读这个备注,如果没有时间你更要阅读以下备注。
在网络上找了很多相关备份和还原的教程,大多都是互相抄袭,按照他们的教程能够成功备份,还原就很让人揪心了。谈谈思路和注意点吧。
首先,第一步不用说,肯定是备份数据库。最简单,打开管理节点的ndb_mgm控制台,输入start backup backupID(backupid用任意数字,比如日期20100106,注意,不能和以前的备份ID相同)。在你的所有存储节点的$datadir/BACKUP下会生成相应备份目录BACKUP-backupid
第二步,ndb_mgm中输入shutdown来关闭所有的存储节点和所有的管理节点(包括它本身)。
第三步,在所有的sql节点中删除数据库,留下系统自带的
//备注,第三步是不是一定需要做呢,目前还没测试过,不过至少制造了一个数据丢失的现象
第四步,按顺序启动mysql集群,所有管理节点,然后所有存储节点(启动时候需要加上参数--initial),最后所有sql节点。
第五步,在存储节点Master(192.168.16.10)上执行ndb_restore还原命令/usr/local/mysql/bin/ndb_restore -n11 -b20100106 -r -m --backup_path=/opt/mydata/BACKUP/BACKUP-20100106/ --ndb-connectstring=nodeid=27,192.168.16.8,192.168.16.9
Master如下。(id=11)
id=11 @192.168.16.10 (mysql-5.1.39 ndb-7.0.9, Nodegroup: 0, Master)
id=12 @192.168.16.11 (mysql-5.1.39 ndb-7.0.9, Nodegroup: 0)
id=13 @192.168.16.12 (mysql-5.1.39 ndb-7.0.9, Nodegroup: 0)
id=14 @192.168.16.13 (mysql-5.1.39 ndb-7.0.9, Nodegroup: 0)
命令解释:/usr/local/mysql/bin/ndb_restore 还原命令
-n 当前存储节点的nodeid
-b 要还原的backupid
-r 数据开关,也就是还原数据了
-m 还原表结构
--ndb-connectstring=nodeid=27,192.168.16.8,192.168.16.9 192.168.16.8,192.168.16.9是两个管理节点的ip,27是什么呢,看看管理节点的config.ini内的mysqld配置,其中有一段如下:
[mysqld]
HostName=192.168.16.24
Id= 25
[mysqld]
HostName=192.168.16.25
Id= 26
[mysqld]
[mysqld]
必须留两个空余的[mysqld],最后一个有指定HostName的mysqld ID=26,那么下一个空白的mysqld的ID默认就是27了。这个前面nodeid=27也就是这么来的,其实改成nodeid=28也是可以的。
第六步,在存储节点slave(除192.168.16.10以外)上执行ndb_restore还原命令/usr/local/mysql/bin/ndb_restore -n12 -b20100106 -r -d --backup_path=/opt/mydata/BACKUP/BACKUP-20100106/ --ndb-connectstring=nodeid=27,192.168.16.8,192.168.16.9
注释:和master差别在把参数-m替换成-d,-n12要相应更换
第七部,接近尾声了,在sql节点上show databases,没看到任何数据库,是不是失败了,不是,create database 你备份的数据.然后在这新库中show表,可以看到数据都回来了。
具体操作请看下面这篇文章。
中午刚刚弄明白了MYSQL集群的备份与恢复。
写下来,以后就不用为这个问题浪费时间了。
1、在管理节点上进行备份。
ndb_mgm> start backup 20100106
Waiting for completed, this may take several minutes
Node 11: Backup 20100106 started from node 1
Node 11: Backup 20100106 started from node 1 completed
StartGCP: 2340 StopGCP: 2343
#Records: 3318 #LogRecords: 0
Data: 427692 bytes Log: 0 bytes
ndb_mgm> shutdown
Node 3: Cluster shutdown initiated
Node 4: Cluster shutdown initiated
Node 4: Node shutdown completed.
Node 3: Node shutdown completed.
2 NDB Cluster node(s) have shutdown.
Disconnecting to allow management server to shutdown.
ndb_mgm> exit
2、删掉SQL节点的数据。一个个节点删过去
DROP DATABASE TEST_CLUSTER;
3、关闭MYSQLD服务器。
[root@localhost bin]# service mysqld stop
Shutting down MySQL... SUCCESS!
4、重新顺序启动所有节点。管理节点(所有的)--存储节点(所有的)--SQL节点(所有的)
[root@localhost mysql]# /usr/local/bin/ndb_mgmd -f /usr/local/mysql-cluster/config.ini --configdir=/usr/local/mysql-cluster/
[root@localhost data]# /usr/local/mysql/bin/ndbd --initial
//我发现如果不带这个 --initial选项的话,恢复会失败。慎重使用--initial,使用这个选项之后发所有数据库中的表都丢了
[root@localhost bin]# service mysqld start
Starting MySQL SUCCESS!
4、在NDBD节点上进行恢复。(每个节点都得执行一次,因为数据分散在两个节点上)
第一个节点NDB的master节点:
[root@localhost BACKUP]# /usr/local/mysql/bin/ndb_restore -n11 -b20100106 -r -m --backup_path=/usr/local/mysql/data/BACKUP/BACKUP-20100106/
-r开关是记录集合。
-m是元数据。就是表和库的SCHEMA。插一句.就是表结构
Nodeid = 11
Backup Id = 20100106
backup path = /usr/local/mysql/data/BACKUP/BACKUP-20100106/
Ndb version in backup files: Version 5.1.21
Connected to ndb!!
Successfully restored table `test_cluster/def/lk4_test`
...
Successfully created index `PRIMARY` on `lk4_test`
...
_____________________________________________________
Processing data in table: test_cluster/def/lk4_test54) fragment 1
_____________________________________________________
...
Restored 37 tuples and 0 log entries
NDBT_ProgramExit: 0 - OK
第二个节点:
[root@localhost BACKUP-1]# /usr/local/mysql/bin/ndb_restore -n4 -b20100106 -r --backup_path=/usr/local/mysql/data/BACKUP/BACKUP-20100106/ --ndb-connectstring=nodeid=27,192.168.16.8,192.168.16.9
Nodeid = 4
Backup Id = 4
backup path = /usr/local/mysql/data/BACKUP/BACKUP-20100106/
Ndb version in backup files: Version 5.1.21
Connected to ndb!!
_____________________________________________________
Processing data in table: sys/def/NDB$EVENTS_0(1) fragment 1
_____________________________________________________
Processing data in table: mysql/def/ndb_apply_status(4) fragment 1
_____________________________________________________
Processing data in table: mysql/def/NDB$BLOB_2_3(3) fragment 1
_____________________________________________________
Processing data in table: test/def/t11(5) fragment 1
_____________________________________________________
Processing data in table: sys/def/SYSTAB_0(0) fragment 1
_____________________________________________________
Processing data in table: mysql/def/ndb_schema(2) fragment 1
Restored 2 tuples and 0 log entries
NDBT_ProgramExit: 0 - OK
这里完成。
5、查看一下有没有数据,为了安全起见。
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| test |
+--------------------+
3 rows in set (0.00 sec)
没有恢复的数据库?
MYSQL现在必须重新建立SCHEMA。也就是数据有了,库还没有。库建起来了自然可以看到内容了
mysql> create database test_cluster;
Query OK, 1 row affected (0.33 sec)
mysql> use test_cluster;
Database changed
mysql> show tables;
+------------------------------+
| Tables_in_test_cluster |
+------------------------------+
| lk4_test |
| ... |
+------------------------------+
27 rows in set (0.11 sec)
mysql> select * from cs_comment;
Empty set (0.00 sec)
不过MYSQL的backup 程序现在还只能进行完全备份.7.0.9貌似也是个样子的。
[root@TM-0182 BACKUP]# du -h
28K ./BACKUP-2
224K ./BACKUP-20100105
36K ./BACKUP-10
36K ./BACKUP-12
28K ./BACKUP-210
36K ./BACKUP-7
32K ./BACKUP-1
36K ./BACKUP-20091217
36K ./BACKUP-11
216K ./BACKUP-20100106
28K ./BACKUP-3
36K ./BACKUP-56
36K ./BACKUP-111
28K ./BACKUP-13
840K .
以下内容未作修改。
6、在NDBD节点上进行恢复的时候有一个要注意的问题。
因为NDBD节点以 --initial 方式启动的时候不会自动删除undo 和 data 文件(即保存到磁盘上的表数据),所以得手动在每个NDBD节点上进行RM操作:
[root@node239 ndb_6_fs]# rm -rf *.dat
然后开始备份。
在MASTER上备份的时候要加 -m 开关。
在SLAVE上要加-d 而且不要-m开关。
具体步骤如下:
MASTER :
[root@localhost ndb_3_fs]# /usr/local/mysql/bin/ndb_restore -n3 -b1 -r -m --backup_path=/usr/local/mysql/data/BACKUP/BACKUP-1/
Nodeid = 3
Backup Id = 1
backup path = /usr/local/mysql/data/BACKUP/BACKUP-1/
Ndb version in backup files: Version 5.1.21
Connected to ndb!!
Creating logfile group: lg_1...done
Creating tablespace: ts_1...done
Creating datafile "data_1.dat"...done
Creating undofile "undo_1.dat"...done
Successfully restored table `test/def/t11`
Successfully restored table event REPL$test/t11
_____________________________________________________
Processing data in table: sys/def/NDB$EVENTS_0(1) fragment 0
_____________________________________________________
Processing data in table: mysql/def/NDB$BLOB_2_3(3) fragment 0
_____________________________________________________
Processing data in table: sys/def/SYSTAB_0(0) fragment 0
_____________________________________________________
Processing data in table: mysql/def/ndb_schema(2) fragment 0
_____________________________________________________
Processing data in table: mysql/def/ndb_apply_status(4) fragment 0
_____________________________________________________
Processing data in table: test/def/t11(10) fragment 0
Restored 26 tuples and 0 log entries
NDBT_ProgramExit: 0 - OK
其他的SLAVE上的操作:
[root@node239 ndb_6_fs]# /usr/local/mysql/bin/ndb_restore -n6 -b1 -r -d --backup_path=/usr/local/mysql/data/BACKUP/BACKUP-1/
Nodeid = 6
Backup Id = 1
backup path = /usr/local/mysql/data/BACKUP/BACKUP-1/
Ndb version in backup files: Version 5.1.21
Connected to ndb!!
_____________________________________________________
Processing data in table: sys/def/NDB$EVENTS_0(1) fragment 3
_____________________________________________________
Processing data in table: mysql/def/NDB$BLOB_2_3(3) fragment 3
_____________________________________________________
Processing data in table: sys/def/SYSTAB_0(0) fragment 3
_____________________________________________________
Processing data in table: mysql/def/ndb_schema(2) fragment 3
_____________________________________________________
Processing data in table: mysql/def/ndb_apply_status(4) fragment 3
_____________________________________________________
Processing data in table: test/def/t11(10) fragment 3
Restored 20 tuples and 0 log entries
NDBT_ProgramExit: 0 - OK
-d 开关的意思即:
-d, --no-restore-disk-objects
Dont restore disk objects (tablespace/logfilegroups etc)
既忽略表空间和分组空间