mariadb配置主从及备份

centos7 mariadb安装使用

Red Hat Enterprise Linux/CentOS 7.0 发行版已将默认的数据库从 MySQL 切换到 MariaDB。

一、添加 MariaDB yum 仓库

1、首先在 RHEL/CentOS 和 Fedora 操作系统中添加 MariaDB 的 YUM 配置文件 MariaDB.repo 文件

#编辑创建mariadb.repo仓库文件

vi /etc/yum.repos.d/mariadb.repo

2、添加repo仓库配置

[mariadb]
name = MariaDB
baseurl = http://mirrors.aliyun.com/mariadb/yum/10.11/centos7-amd64/
gpgkey = https://mirrors.aliyun.com/mariadb/yum/RPM-GPG-KEY-MariaDB
gpgcheck = 1
enabled = 1

二、在 CentOS 7 中安装 MariaDB

1、当 MariaDB 仓库地址添加好后,你可以通过下面的一行命令轻松安装 MariaDB

yum install mariadb-server mariadb-client -y

2、启动mariadb相关命令

systemctl start mariadb  #启动MariaDB

systemctl stop mariadb  #停止MariaDB

systemctl restart mariadb  #重启MariaDB

systemctl enable mariadb  #设置开机启动

三、初始化mysql

1、执行命令初始化

mariadb-secure-installation

在确认 MariaDB 数据库软件程序安装完毕并成功启动后请不要立即使用。为了确保数据 库的安全性和正常运转,需要先对数据库程序进行初始化操作。这个初始化操作涉及下面 5 个 步骤。

➢ 设置 root 管理员在数据库中的密码值(注意,该密码并非 root 管理员在系统中的密 码,这里的密码值默认应该为空,可直接按回车键)。

➢ 设置 root 管理员在数据库中的专有密码。y

➢ 随后删除匿名账户,并使用 root 管理员从远程登录数据库,以确保数据库上运行的业务的安全性。y

➢ 删除默认的测试数据库,取消测试数据库的一系列访问权限。y

➢ 刷新授权列表,让初始化的设定立即生效。y

2、mysql基本命令

中文编码设置,编辑mysql配置文件/etc/my.cnf,下入以下内容

[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
log-error=/var/log/mysqld.log
max_allowed_packet=1024M
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8

生产环境里不会死磕root用户,为了数据库的安全以及和其他用户协同管理数据库,就需要创建其他数据库账户,然后分配权限,满足工作需求

MariaDB [(none)]> create user yuchao@'127.0.0.1' identified by 'redhat123';
MariaDB [(none)]> create user yuchao@localhost identified by 'redhat123';
通过localhost连接到mysql是使用UNIX socket,而通过127.0.0.1连接到mysql是使用TCP/IP

数据库权限设置

MariaDB [(none)]> grant all privileges on *.* to yuchao@127.0.0.1;

grant 权限 on 数据库.表名 to 账户@主机名            对特定数据库中的特定表授权
grant 权限 on 数据库.* to 账户@主机名              对特定数据库中的所有表给与授权
grant 权限1,权限2,权限3 on *.* to 账户@主机名      对所有库中的所有表给与多个授权
grant all privileges on *.* to 账户@主机名      对所有库和所有表授权所有权限

远程连接设置哦设置所有库,所有表的所有权限,赋值权限给所有ip地址的root用户
mysql > grant all privileges on *.* to root@'%' identified by 'password';
#创建用户
mysql > create user 'username'@'%' identified by 'password';
#刷新权限
flush privileges;

移除权限

MariaDB [(none)]> revoke all privileges on *.* from yuchao@127.0.0.1;

四.数据库备份与恢复

1、命令格式

mysqldump [选项] 数据库名 [表名] > 脚本名

mysqldump [选项] --数据库名 [选项 表名] > 脚本名

mysqldump [选项] --all-databases [选项] > 脚本名

mysqldump -u root -p -A -F > /opt/all1-date +%F.sql #参数:-A, --all-databases Dump all the databases -F, --flush-logs 在开始导出前,洗掉在MySQL服务器中的日志文件。
远程数据库备份:mysqldump -h主机名 -P端口 -u用户名 -p密码 --database 数据库名 > 文件名.sql
远程数据库压缩备份:mysqldump -h主机名 -P端口 -u用户名 -p密码 --database 数据库名 | gzip > 文件名.sql.gz

2、实例

备份所有数据库:

mysqldump -uroot -p --all-databases > /backup/mysqldump/all.sql

备份指定数据库:

mysqldump -uroot -p test > /backup/mysqldump/test.sql

备份指定数据库指定表(多个表以空格间隔)

mysqldump -uroot -p  mysql db event > /backup/mysqldump/2table.sql

备份指定数据库排除某些表

mysqldump -uroot -p test --ignore-table=test.t1 --ignore-table=test.t2 > /backup/mysqldump/test2.sql

3、还原

第一种方法:系统行命令

mysqladmin -uroot -p create db_name 
mysql -uroot -p  db_name < /backup/mysqldump/db_name.sql

注:在导入备份数据库前,db_name如果没有,是需要创建的; 而且与db_name.db中数据库名是一样的才可以导入。

第二种方法:source方法

mysql > use db_name;
mysql > source /backup/mysqldump/db_name.sql

五、主从复制 参考文档:https://cloud.tencent.com/developer/article/1381642

mariadb主从复制中:

第一步:master记录二进制日志。在每个事务更新数据完成之前,master在二日志记录这些改变。Mariadb将事务写入二进制日志,即使事务中的语句都是交叉执行的。在事件写入二进制日志完成后,master通知存储引擎提交事务。

第二步:slave将master的binary log拷贝到它自己的中继日志。首先,slave开始一个工作线程——I/O线程。I/O线程在master上打开一个普通的连接,然后开始binlog dump process。Binlog dump process从master的二进制日志中读取事件,如果已经执行完master产生的所有文件,它会睡眠并等待master产生新的事件。I/O线程将这些事件写入中继日志。

第三步:SQL slave thread(SQL线程)处理该过程的最后一步。SQL线程从中继日志读取事件,并重新执行其中的事件而更新slave的数据,使其与master中的数据一致。

1、主机配置

主库:CenterOS7.5-64位 1核1G 系统盘:50GB 高性能云硬盘 内网IP:10.249.16.89

从库:CenterOS7.5-64位 1核1G 系统盘:50GB 高性能云硬盘 内网IP:10.249.16.64

2、同上1-4安装部署mariadb

3、登入主库并创建数据库和表

[root@主库 ~]# mysql -h 127.0.0.1  -u root -p  #连接数据库
mariadb> create database db1;
mariadb> use db1;    
mariadb> create table test (name VARCHAR(20), sex CHAR(1), birth DATE, birthaddr VARCHAR(20)); 
mariadb> insert into test values ('abc','f','1995-10-22','china');
desc  test1;    打印表结构

4、停止mariadb主服务

[root@主库 ~]# systemctl stop mariadb

5、配置mariadb主要同步的数据库名字并开启对应的二进制日志

[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
log-error=/var/log/mysqld.log
max_allowed_packet=1024M
log-bin=mysql-bin        #启用二进制日志,默认存在/var/lib/mariadb 下面
server-id=1              #本机数据库ID 唯一标示
binlog-do-db=db1         #可以被从服务器复制的库。二进制需要同步的数据库名,binlog_do_db:此参数表示只记录指定数据库的二进制日志,默认全部记录。binlog_ignore_db:此参数表示不记录指定的数据库的二进制日志。
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8

6、重新启动

[root@主库 ~]# systemctl start mariadb

7、在主库中复制的授权

mariadb> grant replication slave on *.* to yh@10.249.16.64 identified by "123";

8、在从从库上测试登录

[root@从库 ~]# mysql -h 10.249.16.89 -u yh -p

9、复制前保证主从两个数据库数据一致,把主的原始数据传给从,导出所有数据库:

[root@主库 ~]#mysqldump -u root -p  -A -F > /opt/all1-`date +%F`.sql    #参数:-A, --all-databases Dump all the databases  -F, --flush-logs 在开始导出前,洗掉在MySQL服务器中的日志文件。
如果远程拷贝要加入-h 参数,在实际生产中需要增加字符集

10、数据库复制到从库上

[root@从库 ~]#scp root@10.129.16.89:/opt/all1.sql /opt/

11、在mariadb从服务器从库上导入

[root@从库 ~]# mysql -u root -p < /opt/all1.sql  #导入数据库,和主服务器保持一致
Enter password:                             #YH/2019s2b,直接回车
mariadb> show databases;
mariadb> use db1;
mariadb> show tables;

12、停服务修改/etc/my.cnf

systemctl stop mariadb

[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
log-error=/var/log/mysqld.log
max_allowed_packet=1024M
server-id=2                      #主要这个配置,id不能和主数据库相同
read-only=1    #设置从服务器为只读模式

[client]
default-character-set=utf8
[mysql]
default-character-set=utf8

13、启动服务

systemctl start mariadb

14、在主库89上查看

mariadb> show master status;
ERROR 2006 (HY000): Mariadb server has gone away
No connection. Trying to reconnect...
Connection id: 2
Current database: db1
+-----------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-----------------+----------+--------------+------------------+
| mariadblog.000001 | 245 | db1 |  |

15、在从库64执行

MariaDB [(none)]> change master to master_host='10.249.16.89', master_user='yh', master_password='123', master_port=3306, master_log_file='mariadblog.000001', master_log_pos=396, master_connect_retry=10;
MariaDB [(none)]> start slave; #启动从服务
MariaDB [(none)]> show slave status \G #查看从服务器状态
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 172.17.32.15
Master_User: slave
Master_Port: 3306
Connect_Retry: 10
Master_Log_File: mariadblog.000001
Read_Master_Log_Pos: 396
Relay_Log_File: mariadb-relay-bin.000002
Relay_Log_Pos: 530
Relay_Master_Log_File: mariadblog.000001
Slave_IO_Running: Yes                     #主要关注此参数一个负责与主机的io通信
Slave_SQL_Running: Yes                    #主要关注此参数负责自己的slave mariadb进程

16、测试数据同步

主库写数据89
mariadb> use db1;
Database changed
mariadb> show tables;
+--------------+
| Tables_in_db1 |
+--------------+
| test1 |
+--------------+
1 row in set (0.00 sec)
mariadb> insert into test values('def','a','1996-09-01','china');

从库读数据64
mariadb> use db1;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mariadb> select * from test1;

17、查看主库的binlog日志

> show binlog events;

18、排错:

同步之前如果怀疑主从数据不同步可以采取:上面冷备份远程拷贝法或者在从服务器上命行同步方法。

总结:

1、 主从同步的原理

2、 主从同步的配置

3、 测试主从同步是否成功

六、定时备份MariaDB/MySQL

1.创建备份文件位置

cd /home
mkdir backup_db
cd backup_db
pwd

2、创建脚本

vim backup-mariadb.sh
#!/bin/bash
backupdir='/home/backup_db/'
time=`date +%Y%m%d`
mysqldump -uroot -p密码 --all-databases > $backupdir/$time.sql

3、设置运行权限

chmod +x backup-mariadb.sh

4、安装crond服务

yum install crontabs

5、查看当前定时任务列表

crontab -l

6、编辑定时任务

crontab -e

* * * * * /home/backup_db/backup-mariadb.sh  # 分 时 日 月 年

7、保存后重启

service crond restart

8、查看备份路径已有备份文件

9、把启动定时任务的开关放进 /etc/rc.d/rc.local 中,开启自启动服务

service crond start

七、naticat远程访问权限

> use mysql;
> update user set host = '%' where user = 'root';
> flush privileges;
> select host,user from user;
#此步骤设置了以root用户访问的任何IP都以'root'作为密码
> GRANT ALL PRIVILEGES ON *.* TO'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;
> flush privileges;
posted @ 2021-02-22 10:40  記憶や空白  阅读(370)  评论(0编辑  收藏  举报