mariadb(mysql)

安装

  1. winodows 略
  2. linux
  • 用yum下载安装,先添加yum源,阿里的yum源mariadb版本比较老,要新版本的还是要用官方的源,具体的官方yum源最好去官网查看,有时候会出现证书失效的情况

    重新设置好yun源,可以yum clean all && yun makecache进行加载使用
1. 首先在 RHEL/CentOS 和 Fedora 操作系统中添加 MariaDB 的 YUM 配置文件 MariaDB.repo 文件。
#编辑创建mariadb.repo仓库文件
vi /etc/yum.repos.d/MariaDB.repo 2、添加repo仓库配置
# MariaDB 10.3 CentOS repository list - created 2022-04-01 08:17 UTC
# https://mariadb.org/download/
[mariadb]
name = MariaDB
baseurl = https://mirrors.aliyun.com/mariadb/yum/10.3/centos7-amd64
gpgkey=https://mirrors.aliyun.com/mariadb/yum/RPM-GPG-KEY-MariaDB
gpgcheck=1
  • 安装 yum install MariaDB-server MariaDB-client -y 注意如果是用阿里源,安装的名字不一样 是mariadb
  • 相关的命令参数
systemctl start mariadb  #启动MariaDB

systemctl stop mariadb  #停止MariaDB

systemctl restart mariadb  #重启MariaDB

systemctl enable mariadb  #设置开机启动
  • 刚安装好的mariadb默认有些设置不安全,比如有自带的匿名账户,有测试用的test表 ,root默认没密码,

    在启动mariadb后可以用mysql_secure_installation 进行初始化设置,删除匿名用户和test表

  • 基本命令和授权命令

grant语法 grant 增删改查 on 表1,表2 to 账号1@访问ip identified by 账号1密码 , 赋权完毕后记得刷新权限 flush privileges

grant select,insert,update,delete on . to "test1"@"%" identified by "12345678";

修改mysql密码 set password = PASSWORD('redhat123');
为了数据库的安全以及和其他用户协同管理数据库,就需要创建其他数据库账户,然后分配权限. `create user yuchao@'127.0.0.1' identified by 'redhat123';`
切换普通用户yuchao,查看数据库信息,发现无法看到完整的数据库列表,此事我们需要给yuchao账号进行授权
mysql使用grant命令对账户进行授权,grant命令常见格式如下
grant 权限 on 数据库.表名 to 账户@主机名 对特定数据库中的特定表授权
grant 权限 on 数据库.* to 账户@主机名   对特定数据库中的所有表给与授权
grant 权限1,权限2,权限3 on *.* to 账户@主机名    对所有库中的所有表给与多个授权
grant all privileges on *.* to 账户@主机名    对所有库和所有表授权所有权限 grant all privileges on *.* to yuchao@127.0.0.1; 这一步要用root账号去配置权限
revoke all privileges on *.* from yuchao@127.0.0.1; 移除权限 远程连接设置哦设置所有库,所有表的所有权限,赋值权限给所有ip地址的root用户

备份

  • mysqldump命令用于备份数据库数据

    导出所有数据库的所有数据 mysqldump -u root -p --all-databases > /tmp/db.dump --all-databases 也可以用-A

    导出db1、db2两个数据库的所有数据 mysqldump -uroot -proot --databases db1 db2 >/tmp/user.sql

    刚才重定向备份的数据库文件导入到mysql中 mysql -uroot -p < /tmp/db.dump

    也可以进入数据库后进入响应的表中,用source E:/pro_sql/test.sql 导入,必须先进入对应的表中再用source导入该表的数据.

中文编码配置

编辑mysql配置文件/etc/my.cnf,下入以下内容,要重启systemctl stop mariadb.service进行加载生效

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

自定义mysql的data文件目录踩坑记录

背景:用yum安装的mariadb,在配置文件[mysqld]中新增datadir=/opt/mysql/data 自定义数据库的路径,结果启动失败.

踩坑点1:opt下的mysql以及子目录必须要mysql的用户和组权限, chown -R mysql:mysql /opt/mysql

踩坑点2:用的是阿里云的ECS镜像,里面开启了selinux安全策略,

SELinux则是基于MAC(强制访问机制),简单的说,就是程序和访问对象上都有一个安全标签(即selinux上下文)进行区分,只有对应的标签才能允许访问。否则即使权限是777,也是不能访问的。

可以用sestatus查看selinux的开启状态,那么解决办法有2种,

第一关闭selinux,关闭方法百度,但是不安全

第二种是用chcon -R --reference 原始文件夹 目标文件夹 把默认data文件的安全标签复制给自定义的data文件 ,默认是数据库文件在/var/lib/mysql中,查看文件的安全标签内容用ls -Z命令

[root@localhost opt]# ls -Z
drwxr-xr-x. mysql mysql unconfined_u:object_r:mysqld_db_t:s0 mysql 其中 unconfined_u:object_r:mysqld_db_t 对应的chcon命令的-u unconfined_u -r object_r -t mysqld_db_t
就是unconfined_u _u就代表-u这个参数
这种适用单独设置新目录内每一个文件的 SELinux 设置, 不过我用这个方法设置后,还是无法启动mariadb 用chcon -R --reference却可以,
详情参考 https://blog.csdn.net/bb807777/article/details/108282433

mysql权限一览





数据库层面(db表)的权限分析

mysql安全配置方案

  1. 限制访问mysql端口的ip

windows可以通过windows防火墙或者ipsec来限制,linux下可以通过iptables来限制。

  1. 修改mysql的端口

windows下可以修改配置文件my.ini来实现,linux可以修改配置文件my.cnf来实现。

  1. 对所有用户设置强密码并严格指定对应账号的访问ip

mysql中可在user表中指定用户的访问可访问ip

  1. root特权账号的处理

建议给root账号设置强密码,并指定只容许本地登录

  1. 日志的处理

如需要可开启查询日志,查询日志会记录登录和查询语句。

  1. mysql进程运行账号

在windows下禁止使用local system来运行mysql账户,可以考虑使用network service或者自己新建一个账号,但是必须给与mysql程序所在目录的读取权限和data目录的读取和写入权限; 在linux下,新建一个mysql账号,并在安装的时候就指定mysql以mysql账户来运行,给与程序所在目录的读取权限,data所在目录的读取和写入权限。

  1. mysql运行账号的磁盘权限

1)mysql运行账号需要给予程序所在目录的读取权限,以及data目录的读取和写入权限

2)不容许给予其他目录的写入和执行权限,特别是有网站的。

3)取消mysql运行账户对于cmd,sh等一些程序的执行权限。

  1. 网站使用的mysql账户的处理

    新建一个账户,给予账户在所使用数据库的所有权限即可。这样既能保证网站对所对应的数据库的全部操作,也能保证账户不会因为权限过高而影响安全。给予单个数据库的所有权限的账户不会拥有super, process, file等管理权限的。 当然,如果能很明确是的知道,我的网站需要哪些权限,还是不要多给权限,因为很多时候发布者并不知道网站需要哪些权限,我才建议上面的配置。而且我指的通用的,具体到只有几台机器,不多的情况下,我个人建议还是给予只需要的权限,具体可参考上面的表格的建议。

  2. 删除无用数据库

    test数据库对新建的账户默认有权限

mysql入侵提权分析及防止措施

  1. udf提权

此方式的关键导入一个dll文件,个人认为只要合理控制了进程账户对目录的写入权限即可防止被导入dll文件;然后如果万一被攻破,此时只要进程账户的权限够低,也没办执行高危操作,如添加账户等。

  1. 写入启动文件

这种方式同上,还是要合理控制进程账户对目录的写入权限。

  1. 当root账户被泄露

如果没有合理管理root账户导致root账户被入侵,此时数据库信息肯定是没办法保证了。但是如果对进程账户的权限控制住,以及其对磁盘的权限控制,服务器还是能够保证不被沦陷的。

  1. 普通账户泄露(上述所说的,只对某个库有所有权限的账户)

    此处说的普通账户指网站使用的账户,我给的一个比较方便的建议是直接给予特定库的所有权限。账户泄露包括存在注入及web服务器被入侵后直接拿到数据库账户密码。

    此时,对应的那个数据库数据不保,但是不会威胁到其他数据库。而且这里的普通账户无file权限,所有不能导出文件到磁盘,当然此时还是会对进程的账户的权限严格控制。

    普通账户给予什么样的权限可以见上表,实在不会就直接给予一个库的所有权限。

主从同步

MySQL数据库的主从复制方案,是其自带的功能,并且主从复制并不是复制磁盘上的数据库文件,而是通过binlog日志复制到需要同步的从服务器上。

MySQL数据库支持单向、双向、链式级联,等不同业务场景的复制。在复制的过程中,一台服务器充当主服务器(Master),接收来自用户的内容更新,而一个或多个其他的服务器充当从服务器(slave),接收来自Master上binlog文件的日志内容,解析出SQL,重新更新到Slave,使得主从服务器数据达到一致。

在生产环境中,MySQL主从复制都是异步的复制方式,即不是严格的实时复制,但是给用户的体验都是实时的。

MySQL主从复制集群功能使得MySQL数据库支持大规模高并发读写成为可能,且有效的保护了服务器宕机的数据备份。

主从复制的逻辑有以下几种

  • 一主一从,单向主从同步模式,只能在Master端写入数据

  • 一主多从

  • 双主主复制逻辑架构,此架构可以在Master1或Master2进行数据写入,或者两端同事写入(特殊设置)

  • 配置文件配置 log-bin的文件目录和主从数据库的server-id

- 修改配置文件
vim /etc/my.cnf
#修改内容
#解释:server-id服务的唯一标识(主从之间都必须不同);log-bin启动二进制日志名称为mysql-bin
[mysqld]
server-id=1
# log-bin 可以写路径+文件名,也可以单独写文件名,默认就是在根目录下/data/
#配置文件写路径要注意 要用/ 不能用\
log-bin="D:/mysql_56/data/mysql-test"
#同步错误记录文件
log-error="D:/mysql_56/data/mysql-error"
#主从同步时,可以主库设置要同步的库,或者要忽略同步的库,如果要忽略多个数据库,写多行即可
#可以只在主库设定同步的库,表,也可以在从库中设定,也可以主从都写,相互对应,比如主库的 binlog-do-db=mysql 对应从库的replicate-do-db=mysql
#binlog-ignore-db=mysql
#binlog-do-db=mysql
#也可以在从库中写要复制的库或者表.
#replicate-do-db 设定需要复制的数据库
#replicate-ignore-db 设定需要忽略的复制数据库
#replicate-do-table 设定需要复制的表
#replicate-ignore-table 设定需要忽略的复制表
#replicate-wild-do-table 同replication-do-table功能一样,但是可以通配符
#replicate-wild-ignore-table 同replication-ignore-table功能一样,但是可以加通配符 character-set-server=utf8
collation-server=utf8_general_ci
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8 #重启mariadb
systemctl start mariadb
  • 查看主库状态 show master status 可以看到如下页面

    MariaDB [(none)]> show master status

    -> ;

    +------------------+----------+--------------+------------------+

    | File | Position | Binlog_Do_DB | Binlog_Ignore_DB |

    +------------------+----------+--------------+------------------+

    | mysql-bin.000001 | 575 | | |

    +------------------+----------+--------------+------------------+

    1 row in set (0.00 sec)

    File是二进制日志文件名,Position 是日志开始的位置。后面从库会用到!!!!!

    从库会根据设定的周期查询主库的Position的位置,如果一旦发生变化,就会同步

  • master主库添加从库账号

  1.新建用于主从同步的用户chaoge,允许登录的从库是'192.168.178.130'
create user 'chaoge'@'192.168.178.130' identified by 'redhat'; 2.#题外话:如果提示密码太简单不复合策略加在前面加这句
mysql> set global validate_password_policy=0; 3.给从库账号授权,说明给chaoge从库复制的权限,在192.168.178.130机器上复制
grant replication slave on *.* to 'chaoge'@'192.168.178.130';
#检查主库创建的复制账号
select user,host from mysql.user;
#检查授权账号的权限
show grants for chaoge@'192.168.178.130';
也可以用select * from mysql.user where user='chaoge' and host='192.168.178.130' \G;
#实现对主数据库锁表只读,防止数据写入,数据复制失败
flush table with read lock;
4. 锁表后进行数据导出备份 mysqldump -A 或者mysqldump -database 导出指定的数据库
5. 确保数据导出后,没有数据插入,完毕再查看主库状态 show master status;
6. 导出数据完毕后,解锁主库,恢复可写 unlock tables;
  • slave从库配置
1. 修改Slave的/etc/my.cnf,写入server-id
[mysqld]
server-id=3
2.重启数据库
systemctl restart mariadb
3.检查Slava从数据库的各项参数
show variables like 'log_bin';
show variables like 'server_id';
4.恢复主库Master的数据导入到Slave库
导入数据(注意sql文件的路径)
mysql>source /data/all.sql;
方法二:
#mysql -uroot -p < abc.sql
5.配置复制的参数,Slave从库连接Master主库的配置
mysql > change master to master_host='192.168.178.129',
master_user='chaoge',
master_password='redhat',
master_log_file='mysql-bin.000001',
master_log_pos=575;
6.启动从库的同步开关,测试主从复制的情况
start slave;
7.查看复制状态
show slave status\G;
具体查看下面2个线程状态
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
如果2个线程不都是yes,可以继续往下翻,在Last_io_error中查看错误原因,这个例子中是因为master和slave的id重复了,也可以在stop slave后用全局set global sever_id = 1 进行修改,改完再start slave启动
![](https://img2022.cnblogs.com/blog/1610779/202203/1610779-20220314223611802-469456393.png)
  • 注意此处还未配置从库的只读模式,只需在slave服务器上配置/etc/my.cnf,加上以下配置,并且在slave上创建普通用户,使用普通用户主从同步即可达到只读的效果

    如果用root用户,无法达到readonly,这是一个坑
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
log-error=/var/log/mysqld.log
server-id=3
read-only=true #设置只读
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8

redis

  • 安装部分 编译安装下载下来的都是已经编译过的文件有makefile文件,可以考虑把所有bin文件装在根目录下的/src下,cd /src/后 运行make && make install
  • redis可执行文件
    ./redis-benchmark //用于进行redis性能测试的工具
    ./redis-check-dump //用于修复出问题的dump.rdb文件
    ./redis-cli //redis的客户端
    ./redis-server //redis的服务端
    ./redis-check-aof //用于修复出问题的AOF文件
    ./redis-sentinel //用于集群管理
    • 配置文件内容 完整的可以参考 https://blog.csdn.net/suprezheng/article/details/90679790
    bind 192.168.248.140  # 不少人都误解了。以为这个设置是只对客户端IP的连接限制,其实这是错误的!错误的!错误的!bind是你服务器的IP地址
    protected-mode yes #设置保护模式 开启protected-mode保护模式,如果开启了保护模式,并且bind未配置,密码也未设置。redis只接受来自本机的连接。如果要远程访问,设置为no
    requirepass 192406 设置远程访问密码
    port 6379 #端口
    tcp-backlog 511
    timeout 0
    tcp-keepalive 300
    daemonize yes # 守护进程方式进行,如果设置no,把终端窗口关闭,redis服务也关闭了,无法后台运行
    supervised no
    pidfile /var/run/redis_6379.pid #自定义pid文件路径
    loglevel notice
    logfile /var/log/redis/redis.log #自定义log文件路径
    databases 16 # 默认使用的数据库是0。可以通过”SELECT 【数据库序号】“命令选择一个数据库,序号从0开始
    dir /var/lib/redis #设置数据文件的保存路径,logfile pidfile dbfilename等都以此为根路径
    #rdb的永久保存规则
    #官方出厂配置默认是 900秒内有1个更改,300秒内有10个更改以及60秒内有10000个更改,则将内存中的
    #数据快照写入磁盘。
    # save ""
    save 900 1
    save 300 10
    save 60 10000 dbfilename dump.rdb #设置rdb的文件名字
    #当RDB持久化出现错误后,是否依然进行继续进行工作,yes:不能进行工作,no:可以继续进行工作
    #过info中的rdb_last_bgsave_status了解RDB持久化是否有错误
    stop-writes-on-bgsave-error yes
    rdbcompression yes
    rdbchecksum yes #默认不开启。它的出现是为了弥补RDB的不足(数据的不一致性),所以它采用日志的形式来记录每个写
    #操作,并追加到文件中。Redis 重启的会根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作
    #默认redis使用的是rdb方式持久化,这种方式在许多应用中已经足够用了。但是redis如果中途宕机,会导致可
    #能有几分钟的数据丢失,根据save来策略进行持久化,Append Only File是另一种持久化方式,可以提供更好的
    #持久化特性。Redis会把每次写入的数据在接收后都写入 appendonly.aof 文件,每次启动时Redis都会先把这
    #个文件的数据读入内存里,先忽略RDB文件。若开启rdb则将no改为yes appendonly no
    appendfilename "appendonly.aof"
    appendfsync everysec slave-serve-stale-data yes
    slave-read-only yes
    repl-diskless-sync no
    repl-diskless-sync-delay 5
    repl-disable-tcp-nodelay no
    slave-priority 100
    no-appendfsync-on-rewrite no
    auto-aof-rewrite-percentage 100
    auto-aof-rewrite-min-size 64mb
    aof-load-truncated yes
    lua-time-limit 5000
    slowlog-log-slower-than 10000
    slowlog-max-len 128
    latency-monitor-threshold 0
    notify-keyspace-events ""
    hash-max-ziplist-entries 512
    hash-max-ziplist-value 64
    list-max-ziplist-size -2
    list-compress-depth 0
    set-max-intset-entries 512
    zset-max-ziplist-entries 128
    zset-max-ziplist-value 64
    hll-sparse-max-bytes 3000
    activerehashing yes
    client-output-buffer-limit normal 0 0 0
    client-output-buffer-limit slave 256mb 64mb 60
    client-output-buffer-limit pubsub 32mb 8mb 60
    hz 10
    aof-rewrite-incremental-fsync yes
    • 启动redis服务端
    启动redis非常简单,直接./redis-server就可以启动服务端了,还可以用下面的方法指定要加载的配置文件:./redis-server ../redis.conf
    • 使用redis客户端
    执行客户端命令即可进入
    ./redis-cli
    #测试是否连接上redis
    127.0.0.1:6379 > ping
    返回pong代表连接上了
    如果服务端设置了绑定ip 自定义端口 以及访问密码, 那么要用到-u -p -a[au]

库 redis默认有16个库,0-15索引值,用select 索引值进行切换

普通数据的增删改查

  • 增 是以set key value 进行添加的,添加成功返回ok 比如set name young

    ​ setex key second value 是给键值设置一个过期时间,以秒为单位 比如set name 3 young 3秒后过期 返回nil

    ​ mset key1 value1 key2 value2 ... mset用来设置多个值

  • 查 用get key形式查询 比如get name

    ​ mget key1 key2 可以同时查询多个值

    ​ keys * 查询所有键 keys a* 查询所有a开头的键

    ​ exits key 用来判断键是否存在,存在返回1,不存在返回0

    ​ type key 用来判断key值的类型

  • 删 del key1 key2 ..... del可以同时删除多个key, 返回值是删除的个数

  • 设置过期 除了setex key1 sec value1形式之外 还可以expire key second设置过期时间

hash类型数据

hash用于存储对象,值为string

  • hset key field value 可以理解为是一个{"悟空":{"武器":"金箍棒"}} key是大key field是小key value才是字段
  • hmset key filed1 value1 filed2 value2 同时设置多个字段和值

  • hget key >>> 返回的是filed,同时filed还对应这一个value 而hget key field 则能返回这个对应的value
  • hmget key field1 field2 同时查询一个key下 多个字段的值

1:07

最新文章

  1. 关于IOS中safari下的select下拉菜单,文字过长不换行的问题
  2. 软件工程(FZU2015)赛季得分榜,第二回合
  3. 大素数测试 求因子 poj 1811
  4. vector 之删除元素
  5. 黄聪:查看mysql数据库真正的data目录
  6. android中关闭软键盘
  7. ajax、json一些整理(1)
  8. Linux小知识点汇总
  9. JavaFX基础学习之URLConnection
  10. office2003
  11. nopcommerce插件相关
  12. elasticsearch集群内部节点超时解决
  13. Mysql mysql lost connection to server during query 问题解决方法
  14. 【LeetCode题解】二叉树的遍历
  15. iOS开发:创建真机调试证书步骤(还有一篇是真机测试步骤)(2015年)
  16. Confluence 6 修改你站点的外观和感觉
  17. Unity3d 协程(IEnumerator)范例
  18. linux 添加用户并赋予root权限
  19. React 安装
  20. VM虚拟机装centos无法自动获取IP的解决方法

热门文章

  1. JavaSE——this关键字
  2. MyBatis-Plus的批量处理之insertBatchSomeColumn
  3. Centos 升级glibc 亲测好用
  4. LWC-001_Event
  5. requests学习笔记01
  6. getClassLoader
  7. C#连Mysql数据库报错 SSL Connection error
  8. git多分支-git远程仓库-ssh方式连接远程仓库-协同开发-冲突解决-线上分支合并-远程仓库回滚
  9. 安装kubernetes dashboard以及用户授权
  10. MQTT 发布/订阅模式介绍