本文主要内容:在 Ubuntu 20.04 上安装、保护、使用 MariaDB 和 PyMySQL。
本系列的相关文章:
在 Ubuntu 安装 MariaDB
本文的主要参考内容来自:https://cloud.tencent.com/developer/article/1631666,以下步骤目前亲测可用。MariaDB 是一个开源的关系型数据库管理系统,向后兼容,可替代 MySQL。MariaDB 是由 MySQL 的一些原开发者和很多社区成员共同开发的。
前提条件
拥有 Ubuntu 服务器的管理权限,或者以 root 身份 或者以拥有 sudo 权限的用户身份登录系统。
在 Ubuntu 上安装 MariaDB
sudo apt update
sudo apt install mariadb-server
一旦安装完成,MariaDB 服务将会自动启动。 想要验证数据库服务器是否正在运行,输入:
sudo systemctl status mariadb
输出将会显示服务已经启用,并且正在运行。
保护 MariaDB
MariaDB 服务器有一个脚本叫做mysql_secure_installation
用来提高数据库服务器安全。
不带参数运行脚本:
sudo mysql_secure_installation
脚本将会提示输入 root 密码:
Enter current password for root (enter for none):
因为没有设置 root 密码,仅仅输入回车”Enter”。在下一个提示中,会被问到是否 MySQL root 用户设置密码:
Set root password? [Y/n] n
输入n
。在 Ubuntu 上, MariaDB 用户默认使用auth_socket
进行鉴权。这个插件会检查启动客户端的本地系统用户是否和指定的 MariaDB 用户名相匹配。如果输入Y
,详见本文最后的错误排除。
下一步,将会被要求移除匿名用户,限制 root 用户访问本地机器,移除测试数据库,并且重新加载权限表。这里都填Y
:
Remove anonymous users? [Y/n] Y
Disallow root login remotely? [Y/n] Y
Remove test database and access to it? [Y/n] Y
Reload privilege tables now? [Y/n] Y
以 root 身份登录
想要在终端命令行和 MariaDB 服务器进行交互,使用mysql
客户端工具或者MariaDB
。这个auth_socket
插件将会通过 Unix socket 文件验证用户来连接localhost
。这就意味着不能通过提供密码来验证 root。想要以 root 用户名登录 MariaDB 服务器,输入:
sudo mysql
出现 MariaDB shell,就像下面一样:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 61
Server version: 10.3.22-MariaDB-1ubuntu1 Ubuntu 20.04
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> Bye
如果想使用第三方程序,例如 phpMyAdmin ,以 root 身份登录MariaDB 服务器,有两个选择。
第一个是将鉴权方法从auth_socket
修改为mysql_native_password
(详见本文最后的错误排除):
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'very_strong_password';
FLUSH PRIVILEGES;
(推荐)第二个是创建一个管理员用户,可以访问所有的数据库:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY 'very_strong_password';
可以将这个管理员用户命名为任何想要的名字,但是请确保使用强密码。
安装 PyMySQL
安装 PyMySQL 以在 Python 中使用 MariaDB:
# 安装PyMySQL以在Python中使用MariaDB
sudo python3 -m pip install PyMySQL
pip install PyMySQL
数据库和数据表(创建、修改、删除)
mysql -u用户名 -p密码 # 数据库登录,例如 mysql -uroot -proot
show databases; # 展开数据库列表,注意:所有的分号;不可省略
use eth_5min; # 使用该数据库
show tables; # 查看该数据库下的所有数据表
create database btc_5min # 创建数据库
create table BTC-USDT-SWAP (ts text,o text,h text,l text,c text,vol text,volCcy text); # 创建数据表
select * from your_table limit 10000; # 查找数据
错误排除
下方的内容参考来源为:https://blog.csdn.net/jlu16/article/details/82809937
插入数据出错时:当通过root用户登录到 MySQL 数据库时,得到 ERROR 1698 (28000): Access deniedfor user ‘root’@‘localhost’
的错误提示。
原因是因为在最近的Ubuntu安装(当然也可能是其他安装)中,MySQL默认使用了 UNIX auth_socket plugin 插件。简单来说这意味着当 db_users 使用数据库时,将会通过系统用户认证表进行认证。可以通过下面的命令看看 root 用户是否设置成了这样:
$ sudo mysql -u root # I had to use "sudo" since is new installation
mysql> USE mysql;
mysql> SELECT User, Host, plugin FROM mysql.user;
+------------------+-----------------------+
| User | plugin |
+------------------+-----------------------+
| root | auth_socket |
| mysql.sys | mysql_native_password |
| debian-sys-maint | mysql_native_password |
+------------------+-----------------------+
其中 root 用户在使用auth_socket
插件。而我们设置 root 用户使用mysql_native_password
插件。
$ sudo mysql -u root # I had to use "sudo" since is new installation
mysql> USE mysql;
mysql> UPDATE user SET plugin='mysql_native_password' WHERE User='root';
mysql> FLUSH PRIVILEGES;
mysql> exit;
$ service mysql restart