Mariadb数据转移和主从复制

Mariadb可以看做mysql的分支,操作基本和mysql一致。

数据转移

只是将数据从一个节点的数据库转移到另一个节点的数据库。。。
先将数据库备份成一个sql文件,再在其它节点执行该sql完成数据库数据转移。

数据库备份。

将mariadb中的数据库库备份成一个sql执行文件。

[root@mariadb-server1 ~]# mysqldump -help
Usage: mysqldump [OPTIONS] database [tables]
OR     mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
OR     mysqldump [OPTIONS] --all-databases [OPTIONS]
For more options, use mysqldump --help

可以备份

  • 单个数据库 直接指定数据库名
  • 多个数据库 --databases 指定多个数据库名
  • 所有数据库 --all-databases

示例1 只备份cloud_usage数据库。

mysqldump -u root -p cloud_usage > cloud_usage.sql

输入密码即可开始备份
cloud_usage.sql 为备份的sql文件,文件名可以任意,也不用是sql后缀。
只备份单个数据库的sql文件不会说明使用的哪个数据库,因此在其它节点数据库执行时要指明数据库。

示例2 备份所有的数据库

mysqldump -u root -p --all-databases > alldatabases.sql

会将数据库所有内容写入sql 文件。

sql 文件大致内容

[root@mariadb-server1 ~]# head -30 cloud_usage.sql 
-- MySQL dump 10.14  Distrib 5.5.65-MariaDB, for Linux (x86_64)
--
-- Host: localhost    Database: cloud_usage
-- ------------------------------------------------------
-- Server version	5.5.65-MariaDB

--
-- Table structure for table `account`
--

DROP TABLE IF EXISTS `account`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `account` (
  `id` bigint(20) unsigned NOT NULL,
  `account_name` varchar(100) DEFAULT NULL COMMENT 'an account name set by the creator of the account, defaults to username for single accounts',
  `uuid` varchar(40) DEFAULT NULL,
  `type` int(1) unsigned NOT NULL,
  `domain_id` bigint(20) unsigned DEFAULT NULL,

大约就是一些 数据库表的增删语句,不过单个数据库的sql备份没有use 语句指明数据库

[root@mariadb-server1 ~]# head -30 alldatabases.sql 
-- MySQL dump 10.14  Distrib 5.5.65-MariaDB, for Linux (x86_64)
--
-- Host: localhost    Database: 
-- ------------------------------------------------------
-- Server version	5.5.65-MariaDB


--
-- Current Database: `cloud`
--

CREATE DATABASE /*!32312 IF NOT EXISTS*/ `cloud` /*!40100 DEFAULT CHARACTER SET latin1 */;

USE `cloud`;

--
-- Table structure for table `account`
--

DROP TABLE IF EXISTS `account`;

多个数据库的sql 文件存在use 语句,指明了操作哪个数据库。

sql语句执行 两种方式

方式一 如果sql脚本指定了数据库 -D 参数可以省略

mysql –u用户名 –p密码 –D数据库 <[sql脚本文件路径全名]

mysql -u root -p-D cloud_usage < ./cloud_usage.sql 

再输入密码即可

方式二,进入MySQL命令行,执行source命令。如果sql文件未指定数据库,需提前使用 use 数据库 指令指定数据库

mysql –u用户名 –p密码
source [sql脚本文件的路径全名]

Mariadb 主从备份

概念转自他人

MySQL之间数据复制的基础是以二进制日志文件(binary log file)来实现的,一台MySQL数据库一旦启用二进制日志后,其作为master,它数据库中所有操作都会以“事件”的方式记录在二进制日志中,其他数据库作为slave通过一个I/O线程与主服务器保持通信,并监控master的二进制日志文件的变化,如果发现master二进制日志文件发生变化,则会把变化复制到自己的中继日志中,然后slave的一个SQL线程会把相关的“事件”执行到自己的数据库中,以此实现从数据库和主数据库的一致性,也就实现了主从复制。

实现MySQL主从复制配置要求:

主服务器:1、开启数据库二进制日志功能;2、配置数据库认证唯一服务id;3、获得主库的二进制日志文件名及位置;4、在主库上面创建一个用于主库和从库通信的用户账号,安全管理。

从服务器:1、在从库中配置唯一服务id;2、使用主库创建分配的用户账号读取主库的二进制日志;3、启用slave功能,用于主从通信。

作者:易霂
链接:https://www.jianshu.com/p/fb404e2a681b
来源:简书

测试一主二从备份。准备三个虚拟机
192.168.199.81 mariadb-server1
192.168.199.82 mariadb-server2
192.168.199.83 mariadb-server3
安装 mariadb 服务

yum -y install mariadb-server

mariadb-server1 作为主机master 其余两个作为从机 slave。一般设置主从备份,主机用来写数据,客户端从salve读取数据。

在配置主从复制之前作为master的的数据库中有数据的话,主从复制是不会将之前的数据写入到从机的。如果希望主从数据库数据保持一致,需要先将主数据库的内容备份到从数据库。采用上面的数据转移方法即可

master主机192.168.199.91 master设置

编辑mariadb配置文件

vi /etc/my.cnf

在mysqld 模块中加入

bind-address = 0.0.0.0
log-bin = mysql-bin
server-id = 1

bind-address = 0.0.0.0 表示允许其他主机连接到本数据库,如果不设置的话,Slave_IO_Running状态可能一直是connecting
log-bin 和 server-id 是必须设置的。log-bin开启二进制日志文件,这是主从复制的基础,server-id 设置全局唯一的server-id。
其它可选的相关配置

innodb-file-per-table =ON
skip_name_resolve=ON
read-only=0 			# 设置只读,为零表示读写都可以
binlog-ignore-db=mysql 	# 可选 不进行同步的数据库
binlog-do-db=stusents 	# 可选 只同步这些数据库

默认应该是所有数据库表的修改都会记录到日志文件。。。

重启数据库并进入数据库控制台

systemctl restart mariadb
mysql -u root -p

创建一个用于主从复制的 用户 并赋予对所有库的所有表复制权限。
账号 feng 密码123456 所有网段有效有效

GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* to 'feng'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;

WITH GRANT OPTION 这个选项表示该用户可以将自己拥有的权限授权给别人。注意:经常有人在创建操作用户的时候不指定WITH GRANT OPTION选项导致后来该用户不能使用GRANT命令创建用户或者给其它用户授权。
如果不想这个用户有这个grant的权限,可以不加

刷新使生效

flush privileges;

查看master状态,已经开启二进制日志文件了。

show master status;

记录下 File 和 Position。在设置从服务器是需要使用。
File和Position在master数据库改变数据后是会改变的。如果一个slave不是一开始就加入的,最好要先将master主机数据库的数据先复制一遍。见上文。 或者 记得主从复制开启时File和Position的 初值,将初值填入从机设置。

slave从机 192.168.199.82 192.168.199.83设置

192.168.199.81编辑配置文件。
只用设置惟一的 sever-id

vi /etc/my.cnf
server-id = 2

重启mariadb服务

 systemctl restart mariadb

进入数据库控制台

mysql -u root -p

查看 salve 配置,默认为空。

show slave status\G

进行设置

CHANGE MASTER TO MASTER_HOST="主机IP",
MASTER_USER="账户",
MASTER_PASSWORD="密码",
MASTER_LOG_FILE="主机二进制日志文件",
MASTER_LOG_POS=具体值;

例如

CHANGE MASTER TO MASTER_HOST="192.168.199.81",
MASTER_USER="feng",
MASTER_PASSWORD="123456",
MASTER_LOG_FILE="mysql-bin.000001",
MASTER_LOG_POS=500;

设置完成,查看 slave

show slave status\G

slave未启动
可以看到设置后slave不为空了,但是slave未开启,因此
Slave_IO_Running: No
Slave_SQL_Running: No
只有Slave_IO_Running Slave_SQL_Running运行,从机才会正常复制主服务器数据 因此需要启动slave

启动 slave

start slave;

再次查看slave状态
slave开启后状态Slave_IO_Running: Yes
Slave_SQL_Running: Yes

从机设置完成。。。

192.168.199.83进行基本相同设置。
注意server-id 不能一致 可设置为3

vi /etc/my.cnf
server-id = 3

其他一致

测试主从复制使用

设置完毕,可以测试一下是否成功。
在192.168.199.81 节点master数据库添加数据。查看两个slave节点数据库是否有新增内容。

mysql -u root -p

创建数据库 hero 使用该数据库 创建表hero 添加值

create database hero;
use hero;
create table hero(id int primary key auto_increment, heroName varchar(10) not null, age int default 18);
insert into hero values(0, "张无忌", 20);
insert into hero values(0, "郭靖", 20);
insert into hero values(0, "杨过", 20);

可以查看192.168.199.82 或 192.168.199.83的数据库。果然多了hero数据库
slave有数据
可以看到从库增加了相应的库和表及数据。(数据没看,可以自己测试。。。)

mariadb数据库使用其他。

编码

show variables like 'character%';

character_set_database

mariadb 数据库的默认编码是latin1,不支持中文。
原编码

如果要设置 修改默认编码,需要修改三个文件配置。

vi /etc/my.cnf.d/client.cnf 

在[client] 模块加上

default-character-set=utf8
vi /etc/my.cnf.d/mysql-clients.cnf 

在[mysql]模块加上

default-character-set=utf8
vi /etc/my.cnf.d/server.cnf 

在[mysqld]模块加上

character-set-server=utf8

修改完成重启 mariadb数据库

systemctl restart mariadb

默认编码已经变成了 utf8
utf-8编码

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章