Files
vim-ale/mariadb/README.md
2025-01-26 00:35:50 +00:00

221 lines
5.5 KiB
Markdown

---
title: MariaDB (MySQL)
homepage: https://mariadb.com/
tagline: |
MariaDB: The original MySQL, renamed due to Oracle acquiring the trademark
---
To update or switch versions, run `webi mariadb@stable` (or `@v11`, `@lts`,
etc).
### Files
These are the files / directories that are created and/or modified with this
install:
```text
~/.config/envman/PATH.env
~/.local/opt/mariadb/
~/.local/share/mariadb/
~/.my.cnf
~/.config/mariadb/my.cnf
~/.local/share/mariadb/my.cnf
```
## Cheat Sheet
> MariaDB is the original authors' successor to MySQL, after Oracle's
> acquisition of the MySQL trademark. Although [Postgres](../postgres/) is
> generally recommended for new projects, projects that previously used MySQL or
> MariaDB can continue to gain benefit from the continued development of
> MariaDB.
Connect as the default admin, the root admin, or a remote (`%`) user:
```sh
mysql 'dbname'
sudo mysql -u root 'dbname'
mysql -u 'dbuser' -p -h '127.0.0.1' -P 3306 'dbname'
```
Manage MariaDB as a system service with [serviceman](../serviceman/):
```sh
curl https://webi.sh/serviceman | sh
# Linux and macOS
serviceman add --name 'mysqld' --workdir ~/.local/opt/mariadb/ -- \
mariadbd --defaults-file="$HOME/.local/share/mariadb/my.cnf"
# On Linux, with systemd
sudo systemctl restart systemd-journald
sudo systemctl restart 'mysqld'
sudo journalctl -xef --unit 'mysqld'
```
## Table of Contents
- Use UTF-8 (not Swedish)
- Vertical Rows
- Create an App User and DB
- Backup and Restore
- Connect via SSH Proxy
- Remove default users
### Switch from Swedish to UTF-8
This is done automatically if installed by Webi, and in MariaDB 11.6+.
Edit your `my.cnf` files as follows:
```sh
[server]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init-connect = 'SET NAMES utf8mb4'
```
```sh
[client]
default-character-set = utf8mb4
```
You can then update old tables:
```sql
ALTER DATABASE your_database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
```
See <https://chatgpt.com/c/67941f5a-9390-800e-86e7-2e8bd56117f7>.
In some cases it may be simpler better to **backup and restore** (see table of
contents) the databases due to foreign key constraints.
### How to View Rows Vertically
Use `\G` instead of `;` for a single query
```sh
SELECT * FROM `mysql`.`global_priv` \G
```
### How to Create an App User + DB
You create a database, a user (typically of the same name), a password
(typically random via `xxd` or <https://pw.bnna.net>), and grant the app admin
privileges on its database.
```sql
USE `mysql`;
CREATE DATABASE `appdb`;
CREATE USER 'appuser'@'%' IDENTIFIED BY 'super-secret';
GRANT ALL PRIVILEGES ON `appdb`.* TO 'appuser'@'%';
FLUSH PRIVILEGES;
```
Here's a script for doing the same:
```sh
mariadb-create-app 'foobar'
```
```sh
#!/bin/sh
set -e
set -u
# USAGE
# mariadb-create-app [app-name]
#
# EXAMPLE
# mariadb-create-app 'foobar'
main() {(
b_appname="${1:-$(hostname)}"
b_dbname="${b_appname}"
b_user="${b_dbname}"
b_password="$(xxd -l8 -p /dev/urandom | sed 's/..../&-/g; s/-$//')"
mariadb -e "
USE \`mysql\`;
CREATE DATABASE IF NOT EXISTS \`${b_dbname}\`;
CREATE USER '${b_user}'@'%' IDENTIFIED BY '${b_password}';
GRANT ALL PRIVILEGES ON \`${b_dbname}\`.* TO '${b_user}'@'%';
FLUSH PRIVILEGES;
"
echo "${b_password}" > ./"${b_appname}-password.txt"
echo ""
echo "Password in ./${b_appname}-password.txt"
echo ""
echo "mysql://${b_user}:********@localhost:3306/${b_dbname}"
echo "mariadb -u ${b_user} -p ${b_dbname}"
echo ""
)}
```
### How to Backup and Restore
Backup a single database:
```sh
my_ts="$(date "+%F_%H.%M.%S")"
mysqldump -u username -p --force --hex-blob --databases 'dbname' \
--triggers --routines --events \
--add-drop-table --add-drop-triggers \
--skip-set-charset --single-transaction > ./"backup.${ts}.sql"
```
Notes:
- `--force` **is always necessary** and should be the default - it will continue
the backup in the case that inconsistencies are found - such as a _View_
referencing a column that no longer exists (which is not checked during
`ALTER TABLE`)
- `--skip-set-charset` to accept the default `utf8` rather than accidentally
recreating tables as legacy `latin1-swedish`
- `--add-drop-table` and `--add-drop-triggers` do not need to be used if your
user has the ability to drop and recreate the database
- `--databases 'dbname'` omits ``USE `dbname`;``, which allows you to easily
restore to a different database name
Destructive Restore (drop that database and then restore it):
```sh
mysql -u username -p -e 'DROP DATABASE `dbname`';
mysql -u username -p 'dbname' < ./backup.sql
```
### Connect via SSH Proxy
1. Create a proxy (ignore warnings)
```sh
#ssh user@server -fnNT -L <local-port>:<remote-host>:<remote-port>
ssh ${USER}@${b_hostname} -fnNT -L 13306:localhost:3306
```
2. Connect via `mysql`, `mariadb`, Sequel Ace, etc:
```sh
mysql -u remote-user -h 127.0.0.1 -P 13306
```
**Notes**
- connect with a user that has the host `%` and DOES NOT have a `localhost` or
`127.0.0.1` entry - otherwise the client may "upgrade" to a socket connection
and fail.
- you may need to remove the wildcard `localhost` users (see below)
### Remove Default Access `localhost` Users
You may not be able to connect via an SSH proxy if the default users exist. \
(it may match `` `%`@`localhost` `` instead of `` `app`@`%` `` and deny the
password)
```sql
USE `mysql`;
DELETE FROM `global_priv` WHERE `User` = '';
FLUSH PRIVILEGES;
```