Mariadb数据转移和主从复制及一些常用操作

本文详细介绍了Mariadb的数据转移方法,包括数据库备份和sql语句执行。同时,深入探讨了Mariadb主从复制的配置,包括master和slave的设置、主从复制的重置,并讲解了数据库默认编码、用户管理及权限设置。此外,还特别讨论了如何将master作为CloudStack的连接数据库进行主从复制配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 表示允许其他主机连接到本数据库
log-bin

有三个作用  
	一 	开启了 二进制日志
	二	设置了二进制日志文件名,未设置目录  默认使用 /var/lib/mysql/ 目录
	三	设置了 二进制日志索引文件 .index。文件名master-bin.index 路径 同上/var/lib/mysql/master-bin.index 
	
	log-bin-index 可单独指定 mysql二进制日志索引文件。如log-bin-index = master-bin.index

server-id = 1 设置 数据库中唯一ID 主从复制中该ID唯一。

尽管只设置上面的就可以构建主从复制中master设置,但一般还需要一些优化设置

innodb-file-per-table =ON	# 拆分表数据存储
skip_name_resolve=ON	# 跳过IP反向解析。可节省资源
binlog-ignore-db=information_schema,performance_schema	# 可选 不进行同步的数据库

expire_logs_days = 10	# 自动清除10天前的二进制日志文件

expire_logs_days = 10 # 自动清除10天前的二进制日志文件
由于启用二进制日志。有时候存储东西并不多,但是二进制日志使用空间却很大。为了避免空间不足,可以设置自动清除n天前的日志文件。不设置默认为0 表示不清除。
日志文件默认最大为1G 超出该大小就会创建另一个日志文件

max_binlog_size

重启数据库

systemctl restart mariadb

可以查看下二进制日志文件路径

cd /var/lib/mysql/

二进制日志文件
可以看到 二进制日志文件mysql-bin.000001 索引文件mysql-bin.index

进入数据库控制台

mysql -u root -p

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

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

刷新使生效

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

尽管只用设置server-id就可以当做 主从配置slave 配置。但一般配置的更多一点

skip_name_resolve = ON
innodb_file_per_table = ON
relay_log = slave_relay_bin	# 设置中继日志文件名
relay_log_recovery=1
relay_log_purge=1
relay_log = slave_relay_bin	# 设置中继日志文件名
	通 二进制日志类似,开启中继日志,设置中继日志名。
relay_log_recovery=1
	当slave从库宕机后,假如relay-log损坏了,导致一部分中继日志没有处理,则自动放弃所有未执行的relay-log。
	并且重新从master上获取日志,这样就保证了relay-log的完整性。
	默认情况下该功能是关闭的,将relay_log_recovery的值设置为 1时,可在slave从库上开启该功能,建议开启。
relay_log_purge=1
	中继日志文件自动清除,无需设置,默认开启即为1

重启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=具体值;

MASTER_LOG_FILE MASTER_LOG_POS同刚才在 master 主机查看到的file 和 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=245;

设置完成,查看 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

从机设置完成。。。

这时候查看 mysql 默认存储目录
中继日志查看
可以看到中继日志文件名就是 刚才设置的 slave_relay_bin。
且可以发现 master relay-log 等信息
查看中继日志信息
中继日志信息
可以看到中继日志信息记录了 中继日志 文件 和 位置 以及 master 二进制日志文件和位置

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有数据
可以看到从库增加了相应的库和表及数据。(数据没看,可以自己测试。。。)

主从复制重置

master

reset master;

slave

reset slave;

然后重新查看master的文件和 POS,设置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编码

增加用户及设置访问权限

原作者: Apollo
博客
https://www.cnblogs.com/apollo1616/articles/10294490.html

原作者: IT陈工
博客
https://blog.51cto.com/13873498/2298379

创建用户

命令

CREATE USER 'username'@'host'[IDENTIFIED BY 'password'];

参数

username:
	创建的用户名
host:
	指定该用户在哪个主机上可以登陆,
	如果是本地用户可用localhost,
	如果想让该用户可以从任意远程主机登陆,可以使用通配符%
password:
	该用户的登陆密码,密码可以为空,
	如果为空则该用户可以不需要密码登陆服务器.

IDENTIFIED BY ‘password’ 省略就表示该用户登录不需要输入密码。

默认权限USAGE

USAGE:
	无权限  只有登陆连接数据库的权限。

实例一:

CREATE USER 'feng1'@'192.168.199.90' IDENTIFIED BY '123456';

创建一个用户feng1 密码123456 只允许在主机192.168.199.90 登陆

实例二:

CREATE USER 'feng2'@'%' IDENTIFIED BY '123456';

创建一个用户feng2 密码123456 允许在所有主机登陆

实例三:

CREATE USER 'feng3'@'192.168.199.%' IDENTIFIED BY '123456';

创建一个用户名feng3 密码123456 允许在192.168.199段的主机上登陆

查看数据库用户,一般只查看用户名 和 可登陆主机

select user,host from mysql.user;

创建用户
这三个用户feng1 feng2 feng3目前都是无任何权限的。无法使用它们创建数据库建表等操作。

查看当前用户

select user();

综上,可以看做mariadb中用户并不是以用户名单独存在的,而是用户名加上可登录主机构成了一个用户 ‘username’@‘host’ 不把username当成一个用户,这样理解起来更方便。 一个用户只能通过一个密码登陆进数据库服务器,密码可以为空,但是不可多个。

设置权限

命令

GRANT privileges ON databasename.tablename TO 'username'@'host' [IDENTIFIED BY 'password'];

参数

privileges:
	用户的操作权限,如SELECT,INSERT,UPDATE等,如果要授予所的权限则使用ALL.
databasename:
	数据库名
tablename:
	表名,* 表示所有表
如果要授予该用户对所有数据库和表的相应操作权限,则可用*.*表示

‘username’@‘host’ 表示一个 用户

很多情况下,会跳过创建用户的一步,直接使用设置权限命令可以创建用户,还可以修改已存在用户密码

用户可设置的权限,具体解释还是网上搜比较靠谱

管理类:
    CREATE TEMPORARY TABLES
    CREATE USER
    FILE
    SUPER
    SHOW DATABASES
    RELOAD
    SHUTDOWN
    REPLICATION SLAVE
    REPLICATION CLIENT
    LOCK TABLES
    PROCESS
程序类:FUNCTION(函数),PROCEDURE(存储过程),TRIGGER(触发器)
    CREATE
    ALTER
    DROP
    EXCUTE

数据库和级别:DATABASE(数据库),TABLE(表)
    ALTER
    CREATE
    CREATE VIEW
    DROP
    INDEX
    SHOW VIEW
    GRANT OPTION:能将自己获得的权限转赠给其他用户

数据操作:
    SELECT
    INSERT
    DELETE
    UPDATE

字段级别:
    SELECT(col1,col2,...)
    UPDATE(col1,col2,...)
    INSERT(col1,col2,...)

所有权限:
    ALL PRIVILEGES 或者 ALL

实例一:

GRANT CREATE,ALTER,DROP ON *.* TO 'feng1'@'192.168.199.90';

赋予用户 ‘feng1’@‘192.168.199.90’ 对所有库表的CREATE,ALTER,DROP权限,权限可以是单个,多给权限之间 , 隔开。

实例二:

GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'feng2'@'%' WITH GRANT OPTION;

赋予用户 ‘feng2’@’%’ 对所有库表的 REPLICATION SLAVE, REPLICATION CLIENT 权限,多用于主从复制时权限设置。末尾加上WITH GRANT OPTION表示该用户可以将权限赋予其它用户 ,同在设置权限列表中加上GRANT OPTION 效果是一致的。

实例三:

GRANT ALL PRIVILEGES ON *.* TO 'feng3'@'192.168.199.%';

赋予用户’feng3’@'192.168.199.%'所有权限。

实例四:

GRANT ALL PRIVILEGES ON *.* TO 'feng4'@'%' IDENTIFIED BY '123456';

由于本来不存在用户 ‘feng4’@’%’ 所以该指令会先创建用户,然后再赋予该用户所有权限。

权限设置后有可能刷新不及时等不能立即生效。需要手动刷新

 FLUSH PRIVILEGES;
查看权限

查看帮助

help show grants

权限查看帮助

查看当前登录用户权限
SHOW GRANTS;
SHOW GRANTS FOR CURRENT_USER;
SHOW GRANTS FOR CURRENT_USER();
MariaDB [(none)]> SHOW GRANTS;
+----------------------------------------------------------------------------------------------------------------------------------------+
| Grants for root@localhost                                                                                                              |
+----------------------------------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9' WITH GRANT OPTION |
| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION                                                                           |
+----------------------------------------------------------------------------------------------------------------------------------------+
查看指定用户权限
SHOW GRANTS [FOR user]

如果只指定了 用户名 username 未指定host 默认host 为 ‘%’ 如果没有该用户查看权限失败

SHOW GRANTS FOR 'feng1'@'192.168.199.90';
SHOW GRANTS FOR 'feng2'

用户权限查看

移除权限

命令

REVOKE privileges ON databasename.tablename FROM 'username'@'host';

参数

privileges:
	用户的操作权限,如SELECT,INSERT,UPDATE等,如果要授予所的权限则使用ALL.
databasename:
	数据库名
tablename:
	表名,如果要取消该用户对所有数据库和表的相应操作权限则可用*表示,如*.*

同赋予权限操作命令GRANT类似只是 命令变成了REVOKE,TO 变成了 FROM,该命令不能创建 新用户和更改已有用户密码

特殊处是*.*,如果赋予权限时作用对象是*.*移除权限时作用对象是某一具体的库表,或者赋予权限是作用对象是某一具体的库表移除时作用对象是*.*,那么移除权限的命令不能生效。

实例一

REVOKE DROP, ALTER ON *.* FROM 'feng1'@'192.168.199.90';

移除权限命令

删除用户

mariadb中存储用户的 数据表是 mysql 库下的 user 表。可以通过修改该表内容改变数据库。

一般用该表进行用户查看
查看 所有 用户 的 user, host 一般只用查看这两个字段。

select user,host from mysql.user;

查看用户

可以修改删除表中数据来进行用户改变,但一般不使用这种方法
删除用户 ‘feng4’@’%’

delete from mysql.user where user='feng4' and host='%';

数据表删除用户
修改用户同理,不再举例,但是用户删除修改一般不用修改表的方式实现。

有专门的的命令来进行操作

删除用户命令

查看帮助

 drop user help;

删除用户帮助

可以看到删除用户命令

DROP USER user [, user] ...

user是一个’username’@‘host’,如果只有用户名 那么便会有默认的 host %

实例

DROP USER 'feng3'@'192.168.199.%';
DROP USER 'feng1'@'192.168.199.90';

删除用户实例

重命名用户
help rename user;

重命名用户帮助

RENAME USER old_user TO new_user
    [, old_user TO new_user] ...

可以一次重命名多个。依然是指定’username’@‘host’ 未指定host默认就是%,不同的就是这个规则使用与两个user,不管新旧。

实例

RENAME USER 'feng2' TO 'feng';

重命名用户实例

mariadb主从复制设置master当作CloudStack连接的数据库。

master 主机节点数据库设置。
vi /etc/my.cnf
innodb_rollback_on_timeout=1
innodb_lock_wait_timeout=600
max_connections=350
log-bin=mysql-bin
binlog-format = 'ROW'

bind-address = 0.0.0.0

server-id = 1	#唯一ID
innodb-file-per-table =ON	# 拆分表数据存储
skip_name_resolve=ON	# 跳过IP反向解析。可节省资源
expire_logs_days = 10	# 自动清除10天前的二进制日志文件

设置完毕重启数据库

systemctl restart mariadb

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

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

刷新使生效

flush privileges;
reset master;

查看 master 的状态,记录下File 和 Position

show master status;

show master status

slave 从机设置
vi /etc/my.cnf
innodb_rollback_on_timeout=1
innodb_lock_wait_timeout=600
max_connections=350
log-bin=mysql-bin
binlog-format = 'ROW'

server-id = 2
skip_name_resolve = ON
innodb_file_per_table = ON
relay_log = slave_relay_bin	
relay_log_recovery=1
relay_log_purge=1

设置完毕重启数据库

systemctl restart mariadb

多个从机设置只要 server-id 不同即可
设置slave

mysql -u root -p
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.000002",
MASTER_LOG_POS=245;

启动slave

start slave;
master创建cloudstack所需用户
mysql -u root -p

创建cloud 用户

GRANT PROCESS ON *.* TO 'cloud'@'localhost' IDENTIFIED BY '123456';
GRANT ALL PRIVILEGES ON `cloud`.* TO 'cloud'@'localhost' ;
GRANT ALL PRIVILEGES ON `cloud_usage`.* TO 'cloud'@'localhost';

GRANT PROCESS ON *.* TO 'cloud'@'%' IDENTIFIED BY '123456';
GRANT ALL PRIVILEGES ON `cloud`.* TO 'cloud'@'%';
GRANT ALL PRIVILEGES ON `cloud_usage`.* TO 'cloud'@'%';

cloudstack如果初始化数据选择master节点

cloudstack-setup-databases cloud:123456@master --deploy-as=root:123456
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值