Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Explore MariaDB Server, the powerful open-source relational database. This comprehensive documentation covers installation, deployment, usage, security, and advanced topics to help you master MariaDB.
Get started quickly with MariaDB Server using these quickstart guides. Follow step-by-step instructions to install, configure, and begin using MariaDB for your projects.
This guide provides a walkthrough of the INSERT, UPDATE, and DELETE statements, demonstrating how to add, modify, and remove data in tables.
Learn how to perform essential SQL operations such as creating tables, inserting data, and using aggregate functions like MAX, MIN, and AVG.
Learn how to modify existing table structures using the ALTER TABLE statement, including adding columns, changing types, and managing indexes.
Learn how to efficiently import data into MariaDB tables from external files using the LOAD DATA INFILE statement.
This guide provides a conceptual overview of database indexes, explaining their purpose, different types, and when to use them for optimization.
+----+------------+-----------+-------------------------+---------------------------+--------------+
| ID | First_Name | Last_Name | Position | Home_Address | Home_Phone |
+----+------------+-----------+-------------------------+---------------------------+--------------+
| 1 | Mustapha | Mond | Chief Executive Officer | 692 Promiscuous Plaza | 326-555-3492 |
| 2 | Henry | Foster | Store Manager | 314 Savage Circle | 326-555-3847 |
| 3 | Bernard | Marx | Cashier | 1240 Ambient Avenue | 326-555-8456 |
| 4 | Lenina | Crowne | Cashier | 281 Bumblepuppy Boulevard | 328-555-2349 |
| 5 | Fanny | Crowne | Restocker | 1023 Bokanovsky Lane | 326-555-6329 |
| 6 | Helmholtz | Watson | Janitor | 944 Soma Court | 329-555-2478 |
+----+------------+-----------+-------------------------+---------------------------+--------------+This guide introduces the different types of JOINs (INNER, LEFT, RIGHT, CROSS) and demonstrates how to combine data from multiple tables.
Explore complex join scenarios. This guide covers filtering joined data with WHERE clauses, handling dates, and aggregating results from multiple tables for deeper analysis.
This guide explores MariaDB functions for performing calculations and modifications on date and time values, like DATE_ADD and DATE_SUB.
This guide indicates where the various system and status variables of MariaDB Server are found.
Complete MariaDB backup and recovery guide. Complete resource for backup methods, mariabackup usage, scheduling, and restoration for production use.
Discover how to create and use views to simplify complex queries, restrict data access, and present a specific perspective of your data.
Grasp the basics of using MariaDB Server. This section introduces fundamental concepts, common SQL commands, and essential operations to get you started with your database.
Learn strategies for debugging SQL queries, including formatting for readability, using aliases effectively, and interpreting syntax errors.
This guide provides examples of frequent SQL patterns, such as finding maximum values, calculating averages, and using auto-increment columns.
Learn how to connect to MariaDB Server. This section details various methods and tools for establishing secure and efficient connections to your database from different applications and environments.
Learn effective data handling in MariaDB Server. This section covers data types, storage engines, data manipulation, and best practices for managing your information efficiently.
Learn to back up and restore MariaDB Server databases. This section covers essential strategies and tools to ensure data safety and quick recovery from potential data loss.
Complete MariaDB backup and recovery guide. Complete resource for backup methods, mariabackup usage, scheduling, and restoration for production use.
mariadb-backupmariadb-dumpmariadb-dump Examplesmariadb-hotcopymariadb-hotcopy ExamplesComplete MariaDB backup and recovery guide. Complete resource for backup methods, mariabackup usage, scheduling, and restoration for production use.
Restore specific tables from a backup. Learn the process of importing individual .ibd files to recover specific tables without restoring the whole database.
Understand backup locking stages. This page explains how mariadb-backup uses BACKUP STAGE statements to minimize locking during operation.
BACKUP STAGE in MariaDB Community ServerBACKUP STAGE in MariaDB Community ServerBACKUP STAGE START in MariaDB Community ServerBACKUP STAGE FLUSH in MariaDB Community ServerBACKUP STAGE BLOCK_DDL in MariaDB Community ServerBACKUP STAGE BLOCK_COMMIT in MariaDB Community ServerBACKUP STAGE END in MariaDB Community ServerBACKUP STAGE in MariaDB Enterprise ServerBACKUP STAGE START in MariaDB Enterprise ServerBACKUP STAGE FLUSH in MariaDB Enterprise ServerBACKUP STAGE BLOCK_DDL in MariaDB Enterprise ServerBACKUP STAGE BLOCK_COMMIT in MariaDB Enterprise ServerBACKUP STAGE END in MariaDB Enterprise ServerManage tables in MariaDB Server. This section details creating, altering, and dropping tables, along with understanding data types and storage engines for optimal database design.
Optimize large tables in MariaDB Server with partitioning. Learn how to divide tables into smaller, manageable parts for improved performance, easier maintenance, and scalability.
Learn to maintain MariaDB partitions using ALTER TABLE. Includes syntax for optimizing and repairing partitions, plus best practices for managing time-series data and performance.
Explore different partitioning types for MariaDB Server tables. Understand range, list, hash, and key partitioning to optimize data management and improve query performance.
Understand KEY partitioning, similar to HASH but using MariaDB's internal hashing function on one or more columns to distribute data.
Learn about LINEAR KEY partitioning, which combines the internal key hashing with a linear algorithm for efficient partition handling.
Automate tasks in MariaDB Server with stored routines. Learn to create and manage stored procedures and functions for enhanced database efficiency and code reusability.
Master stored procedures in MariaDB Server. This section covers creating, executing, and managing these powerful routines to encapsulate complex logic and improve application performance.
sudo apt updatesudo yum update # For older systems
sudo dnf update # For newer systemssudo apt install mariadb-server mariadb-client galera-4sudo dnf install mariadb mariadb-serversudo mariadb-secure-installationsudo systemctl status mariadbsudo systemctl start mariadbmariadb -u root -pINSERT table1 VALUES('value1','value2','value3');INSERT INTO table1 (col3, col1) VALUES('value_for_col3', 'value_for_col1');INSERT INTO table2 (id_col, data_col1, data_col2) VALUES
('id1', 'text_a', 'text_b'),
('id2', 'text_c', 'text_d'),
('id3', 'text_e', 'text_f');INSERT IGNORE INTO table2 (unique_id_col, data_col) VALUES
('id1', 'some_data'), -- Will be inserted if new
('id2', 'other_data'), -- Will be inserted if new
('id1', 'duplicate_data'); -- Will be ignored if 'id1' already exists or was just insertedINSERT LOW_PRIORITY INTO table1 VALUES('value1','value2','value3');-- Syntax for historical reference; may not be supported
INSERT DELAYED INTO table1 VALUES('value1','value2','value3');INSERT INTO softball_team (last_name, first_name, telephone)
SELECT name_last, name_first, tel_home
FROM company_database.employees
WHERE is_on_softball_team = 'Y';REPLACE LOW_PRIORITY INTO table2 (id_col, data_col1, data_col2) VALUES
('id1', 'new_text_a', 'new_text_b'), -- If 'id1' exists, old row is deleted, this is inserted
('id2', 'new_text_c', 'new_text_d'), -- If 'id2' doesn't exist, this is inserted
('id3', 'new_text_e', 'new_text_f');UPDATE table3
SET col1 = 'new_value_a', col2 = 'new_value_b'
WHERE id_column < 100;UPDATE table5
SET event_date = DATE_ADD(event_date, INTERVAL 1 DAY)
WHERE DAYOFWEEK(event_date) = 1; -- Example: Add 1 day if event_date is a SundayUPDATE LOW_PRIORITY table3
SET col1 = 'updated_text_a', col2 = 'updated_text_b'
WHERE status_column = 'pending'
ORDER BY creation_date DESC
LIMIT 10;UPDATE products p
JOIN stock_levels s ON p.product_id = s.product_id
SET p.stock_count = s.current_stock
WHERE s.warehouse_id = 'WHA';INSERT INTO table1 (id, col1, col2, status_column)
VALUES ('1012', 'some_text', 'other_text', 'new')
ON DUPLICATE KEY UPDATE status_column = 'old', col2 = VALUES(col2);CREATE TABLE t1 ( a INT );CREATE TABLE t2 ( b INT );CREATE TABLE student_tests (
name CHAR(10), test CHAR(10),
score TINYINT, test_date DATE
);INSERT INTO t1 VALUES (1), (2), (3);INSERT INTO t2 VALUES (2), (4);INSERT INTO student_tests
(name, test, score, test_date) VALUES
('Chun', 'SQL', 75, '2012-11-05'),
('Chun', 'Tuning', 73, '2013-06-14'),
('Esben', 'SQL', 43, '2014-02-11'),
('Esben', 'Tuning', 31, '2014-02-09'),
('Kaolin', 'SQL', 56, '2014-01-01'),
('Kaolin', 'Tuning', 88, '2013-12-29'),
('Tatiana', 'SQL', 87, '2012-04-28'),
('Tatiana', 'Tuning', 83, '2013-09-30');CREATE TABLE student_details (
id INT NOT NULL AUTO_INCREMENT, name CHAR(10),
date_of_birth DATE, PRIMARY KEY (id)
);INSERT INTO student_details (name,date_of_birth) VALUES
('Chun', '1993-12-31'),
('Esben','1946-01-01'),
('Kaolin','1996-07-16'),
('Tatiana', '1988-04-13');SELECT * FROM student_details;+----+---------+---------------+
| id | name | date_of_birth |
+----+---------+---------------+
| 1 | Chun | 1993-12-31 |
| 2 | Esben | 1946-01-01 |
| 3 | Kaolin | 1996-07-16 |
| 4 | Tatiana | 1988-04-13 |
+----+---------+---------------+SELECT * FROM t1 INNER JOIN t2 ON t1.a = t2.b;SELECT MAX(a) FROM t1;+--------+
| MAX(a) |
+--------+
| 3 |
+--------+SELECT MIN(a) FROM t1;+--------+
| MIN(a) |
+--------+
| 1 |
+--------+SELECT AVG(a) FROM t1;+--------+
| AVG(a) |
+--------+
| 2.0000 |
+--------+SELECT name, MAX(score) FROM student_tests GROUP BY name;+---------+------------+
| name | MAX(score) |
+---------+------------+
| Chun | 75 |
| Esben | 43 |
| Kaolin | 88 |
| Tatiana | 87 |
+---------+------------+SELECT name, test, score FROM student_tests
ORDER BY score DESC; -- Use ASC for ascending order+---------+--------+-------+
| name | test | score |
+---------+--------+-------+
| Kaolin | Tuning | 88 |
| Tatiana | SQL | 87 |
| Tatiana | Tuning | 83 |
| Chun | SQL | 75 |
| Chun | Tuning | 73 |
| Kaolin | SQL | 56 |
| Esben | SQL | 43 |
| Esben | Tuning | 31 |
+---------+--------+-------+SELECT name, test, score FROM student_tests
WHERE score = (SELECT MIN(score) FROM student_tests);+-------+--------+-------+
| name | test | score |
+-------+--------+-------+
| Esben | Tuning | 31 |
+-------+--------+-------+SELECT name, test, score FROM student_tests st1
WHERE score = (SELECT MAX(st2.score) FROM student_tests st2 WHERE st1.name = st2.name);+---------+--------+-------+
| name | test | score |
+---------+--------+-------+
| Chun | SQL | 75 |
| Esben | SQL | 43 |
| Kaolin | Tuning | 88 |
| Tatiana | SQL | 87 |
+---------+--------+-------+SELECT CURDATE() AS today;+------------+
| today |
+------------+
| 2014-02-17 | -- Example output; actual date will vary
+------------+SELECT name, date_of_birth, TIMESTAMPDIFF(YEAR, date_of_birth, '2014-08-02') AS age
FROM student_details;+---------+---------------+------+
| name | date_of_birth | age |
+---------+---------------+------+
| Chun | 1993-12-31 | 20 |
| Esben | 1946-01-01 | 68 |
| Kaolin | 1996-07-16 | 18 |
| Tatiana | 1988-04-13 | 26 |
+---------+---------------+------+SELECT @avg_score := AVG(score) FROM student_tests;+-------------------------+
| @avg_score:= AVG(score) |
+-------------------------+
| 67.000000000 |
+-------------------------+SELECT * FROM student_tests WHERE score > @avg_score;+---------+--------+-------+------------+
| name | test | score | test_date |
+---------+--------+-------+------------+
| Chun | SQL | 75 | 2012-11-05 |
| Chun | Tuning | 73 | 2013-06-14 |
| Kaolin | Tuning | 88 | 2013-12-29 |
| Tatiana | SQL | 87 | 2012-04-28 |
| Tatiana | Tuning | 83 | 2013-09-30 |
+---------+--------+-------+------------+SET @count = 0;SELECT @count := @count + 1 AS counter, name, date_of_birth FROM student_details;+---------+---------+---------------+
| counter | name | date_of_birth |
+---------+---------+---------------+
| 1 | Chun | 1993-12-31 |
| 2 | Esben | 1946-01-01 |
| 3 | Kaolin | 1996-07-16 |
| 4 | Tatiana | 1988-04-13 |
+---------+---------+---------------+SELECT table_schema AS `DB`, table_name AS `TABLE`,
ROUND(((data_length + index_length) / 1024 / 1024), 2) `Size (MB)`
FROM information_schema.TABLES
WHERE table_schema = DATABASE() -- This clause restricts results to the current database
ORDER BY (data_length + index_length) DESC;+--------------------+---------------------------------------+-----------+
| DB | Table | Size (MB) | -- Example Output
+--------------------+---------------------------------------+-----------+
| your_db_name | some_large_table | 7.05 |
| your_db_name | another_table | 6.59 |
...
+--------------------+---------------------------------------+-----------+CREATE TABLE t (id INT, f1 VARCHAR(2));INSERT INTO t VALUES (1,'a'), (2,'a'), (3,'b'), (4,'a');DELETE t_del FROM t AS t_del
INNER JOIN (
SELECT f1, MAX(id) AS max_id
FROM t
GROUP BY f1
HAVING COUNT(*) > 1 -- Identify groups with actual duplicates
) AS t_keep ON t_del.f1 = t_keep.f1 AND t_del.id < t_keep.max_id;SELECT * FROM t;+------+------+
| id | f1 |
+------+------+
| 3 | b |
| 4 | a |
+------+------+DESCRIBE clients;+-------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+-------+
| cust_id | int(11) | | PRI | 0 | |
| name | varchar(25) | YES | | NULL | |
| address | varchar(25) | YES | | NULL | |
| city | varchar(25) | YES | | NULL | |
| state | char(2) | YES | | NULL | |
| zip | varchar(10) | YES | | NULL | |
| client_type | varchar(4) | YES | | NULL | |
+-------------+-------------+------+-----+---------+-------+mariadb-dump --user='your_username' --password='your_password' --add-locks db1 clients > clients.sqlmariadb --user='your_username' --password='your_password' db1 < clients.sqlALTER TABLE clients
ADD COLUMN status CHAR(2);ALTER TABLE clients
ADD COLUMN address2 VARCHAR(25) AFTER address;ALTER TABLE clients
ADD COLUMN new_first_column VARCHAR(50) FIRST;DESCRIBE clients;+-------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+-------+
| cust_id | int(11) | | PRI | 0 | |
| name | varchar(25) | YES | | NULL | |
| address | varchar(25) | YES | | NULL | |
| address2 | varchar(25) | YES | | NULL | |
| city | varchar(25) | YES | | NULL | |
| state | char(2) | YES | | NULL | |
| zip | varchar(10) | YES | | NULL | |
| client_type | varchar(4) | YES | | NULL | |
| status | char(2) | YES | | NULL | |
+-------------+-------------+------+-----+---------+-------+ALTER TABLE clients
CHANGE status status ENUM('AC','IA');ALTER TABLE clients
CHANGE status active ENUM('AC','IA');ALTER TABLE clients
MODIFY address1 VARCHAR(40); -- Assuming 'address1' is an existing columnALTER TABLE clients
CHANGE address address1 VARCHAR(40),
MODIFY active ENUM('yes','no','AC','IA'); -- Temporarily include allUPDATE clients
SET active = 'yes'
WHERE active = 'AC';
UPDATE clients
SET active = 'no'
WHERE active = 'IA';ALTER TABLE clients
MODIFY active ENUM('yes','no');ALTER TABLE clients
DROP COLUMN client_type;ALTER TABLE clients
ALTER state SET DEFAULT 'LA';ALTER TABLE clients
ALTER state DROP DEFAULT;SHOW INDEX FROM clients\G*************************** 1. row ***************************
Table: clients
Non_unique: 0
Key_name: PRIMARY
Seq_in_index: 1
Column_name: cust_id
Collation: A
Cardinality: 0
Sub_part: NULL
Packed: NULL
Comment:ALTER TABLE clients
DROP PRIMARY KEY,
CHANGE cust_id client_id INT PRIMARY KEY;ALTER TABLE clients
DROP INDEX cust_id_unique_idx, -- Use the actual Key_name
CHANGE cust_id client_id INT UNIQUE;ALTER TABLE clients
DROP INDEX cust_id, -- If cust_id is the Key_name
CHANGE cust_id client_id INT UNIQUE;ALTER IGNORE TABLE clients
DROP INDEX cust_id_idx, -- Assuming cust_id_idx is the name of the old INDEX
CHANGE cust_id client_id INT UNIQUE;RENAME TABLE clients TO client_addresses;RENAME TABLE client_addresses TO db2.client_addresses;ALTER TABLE client_addresses
ORDER BY city, name;USE sales_dept; -- Or your database nameLOAD DATA INFILE '/tmp/prospects.txt'
INTO TABLE prospect_contact
FIELDS TERMINATED BY '|';LOAD DATA INFILE '/tmp/prospects.txt'
INTO TABLE prospect_contact
FIELDS TERMINATED BY '|' ENCLOSED BY '"'
LINES STARTING BY '"' TERMINATED BY '"\r\n';LOAD DATA INFILE '/tmp/prospects.txt'
REPLACE INTO TABLE prospect_contact
FIELDS TERMINATED BY '|';LOAD DATA INFILE '/tmp/prospects.txt'
IGNORE INTO TABLE prospect_contact
FIELDS TERMINATED BY '|';LOAD DATA LOW_PRIORITY INFILE '/tmp/prospects.txt'
INTO TABLE prospect_contact
FIELDS TERMINATED BY '|';LOAD DATA INFILE '/tmp/prospects.txt'
INTO TABLE prospect_contact
FIELDS TERMINATED BY '|'
LINES TERMINATED BY 0x0d0a; -- 0x0d is carriage return, 0x0a is line feedLOAD DATA INFILE '/tmp/prospects.txt'
INTO TABLE prospect_contact
FIELDS TERMINATED BY '|'
IGNORE 1 LINES; -- Skips the first lineLOAD DATA INFILE '/tmp/prospects.txt'
INTO TABLE prospect_contact
FIELDS TERMINATED BY '|'
ENCLOSED BY '"'
ESCAPED BY '#'
IGNORE 1 LINES;LOAD DATA INFILE '/tmp/prospects.txt'
INTO TABLE prospect_contact
FIELDS TERMINATED BY '|' -- Or your actual delimiter, e.g., 0x09 for tab
ENCLOSED BY '"'
ESCAPED BY '#'
IGNORE 1 LINES
(name_last, name_first, telephone);mariadb-import --user='your_username' --password='your_password' \
--fields-terminated-by='|' --lines-terminated-by='\r\n' \
--replace --low-priority --fields-enclosed-by='"' \
--fields-escaped-by='#' --ignore-lines='1' --verbose \
--columns='name_last,name_first,telephone' \
sales_dept '/tmp/prospect_contact.txt'mariadb-dump --user='local_user' --password='local_pass' --no-create-info local_db prospect_contact > /tmp/prospects.sqlmariadb --user='remote_user' --password='remote_pass' remote_sales_dept < /tmp/prospects.sql+-----------+----+
| Last_Name | ID |
+-----------+----+
| Crowne | 4 |
| Crowne | 5 |
| Foster | 2 |
| Marx | 3 |
| Mond | 1 |
| Watson | 6 |
+-----------+----++-------------------------+----+
| Position | ID |
+-------------------------+----+
| Cashier | 3 |
| Cashier | 4 |
| Chief Executive Officer | 1 |
| Janitor | 6 |
| Restocker | 5 |
| Store Manager | 2 |
+-------------------------+----+CREATE TABLE t1 ( a INT );
CREATE TABLE t2 ( b INT );
INSERT INTO t1 VALUES (1), (2), (3);
INSERT INTO t2 VALUES (2), (4);SELECT * FROM t1 INNER JOIN t2 ON t1.a = t2.b;+------+------+
| a | b |
+------+------+
| 2 | 2 |
+------+------+
1 row in set (0.00 sec)SELECT * FROM t1 CROSS JOIN t2;+------+------+
| a | b |
+------+------+
| 1 | 2 |
| 2 | 2 |
| 3 | 2 |
| 1 | 4 |
| 2 | 4 |
| 3 | 4 |
+------+------+
6 rows in set (0.00 sec)SELECT * FROM t1 LEFT JOIN t2 ON t1.a = t2.b;+------+------+
| a | b |
+------+------+
| 1 | NULL |
| 2 | 2 |
| 3 | NULL |
+------+------+
3 rows in set (0.00 sec)SELECT * FROM t1 RIGHT JOIN t2 ON t1.a = t2.b;+------+------+
| a | b |
+------+------+
| 2 | 2 |
| NULL | 4 |
+------+------+
2 rows in set (0.00 sec)SELECT * FROM t2 LEFT JOIN t1 ON t1.a = t2.b;+------+------+
| b | a |
+------+------+
| 2 | 2 |
| 4 | NULL |
+------+------+
2 rows in set (0.00 sec)SELECT * FROM t1, t2 WHERE t1.a = t2.b;SELECT * FROM t1, t2;CREATE TABLE `Employees` (
`ID` TINYINT(3) UNSIGNED NOT NULL AUTO_INCREMENT,
`First_Name` VARCHAR(25) NOT NULL,
`Last_Name` VARCHAR(25) NOT NULL,
`Position` VARCHAR(25) NOT NULL,
`Home_Address` VARCHAR(50) NOT NULL,
`Home_Phone` VARCHAR(12) NOT NULL,
PRIMARY KEY (`ID`)
) ENGINE=MyISAM;INSERT INTO `Employees` (`First_Name`, `Last_Name`, `Position`, `Home_Address`, `Home_Phone`)
VALUES
('Mustapha', 'Mond', 'Chief Executive Officer', '692 Promiscuous Plaza', '326-555-3492'),
('Henry', 'Foster', 'Store Manager', '314 Savage Circle', '326-555-3847'),
('Bernard', 'Marx', 'Cashier', '1240 Ambient Avenue', '326-555-8456'),
('Lenina', 'Crowne', 'Cashier', '281 Bumblepuppy Boulevard', '328-555-2349'),
('Fanny', 'Crowne', 'Restocker', '1023 Bokanovsky Lane', '326-555-6329'),
('Helmholtz', 'Watson', 'Janitor', '944 Soma Court', '329-555-2478');CREATE TABLE `Hours` (
`ID` TINYINT(3) UNSIGNED NOT NULL,
`Clock_In` DATETIME NOT NULL,
`Clock_Out` DATETIME NOT NULL
) ENGINE=MyISAM;INSERT INTO `Hours`
VALUES
('1', '2005-08-08 07:00:42', '2005-08-08 17:01:36'),
('1', '2005-08-09 07:01:34', '2005-08-09 17:10:11'),
('1', '2005-08-10 06:59:56', '2005-08-10 17:09:29'),
('1', '2005-08-11 07:00:17', '2005-08-11 17:00:47'),
('1', '2005-08-12 07:02:29', '2005-08-12 16:59:12'),
('2', '2005-08-08 07:00:25', '2005-08-08 17:03:13'),
('2', '2005-08-09 07:00:57', '2005-08-09 17:05:09'),
('2', '2005-08-10 06:58:43', '2005-08-10 16:58:24'),
('2', '2005-08-11 07:01:58', '2005-08-11 17:00:45'),
('2', '2005-08-12 07:02:12', '2005-08-12 16:58:57'),
('3', '2005-08-08 07:00:12', '2005-08-08 17:01:32'),
('3', '2005-08-09 07:01:10', '2005-08-09 17:00:26'),
('3', '2005-08-10 06:59:53', '2005-08-10 17:02:53'),
('3', '2005-08-11 07:01:15', '2005-08-11 17:04:23'),
('3', '2005-08-12 07:00:51', '2005-08-12 16:57:52'),
('4', '2005-08-08 06:54:37', '2005-08-08 17:01:23'),
('4', '2005-08-09 06:58:23', '2005-08-09 17:00:54'),
('4', '2005-08-10 06:59:14', '2005-08-10 17:00:12'),
('4', '2005-08-11 07:00:49', '2005-08-11 17:00:34'),
('4', '2005-08-12 07:01:09', '2005-08-12 16:58:29'),
('5', '2005-08-08 07:00:04', '2005-08-08 17:01:43'),
('5', '2005-08-09 07:02:12', '2005-08-09 17:02:13'),
('5', '2005-08-10 06:59:39', '2005-08-10 17:03:37'),
('5', '2005-08-11 07:01:26', '2005-08-11 17:00:03'),
('5', '2005-08-12 07:02:15', '2005-08-12 16:59:02'),
('6', '2005-08-08 07:00:12', '2005-08-08 17:01:02'),
('6', '2005-08-09 07:03:44', '2005-08-09 17:00:00'),
('6', '2005-08-10 06:54:19', '2005-08-10 17:03:31'),
('6', '2005-08-11 07:00:05', '2005-08-11 17:02:57'),
('6', '2005-08-12 07:02:07', '2005-08-12 16:58:23');SELECT
`Employees`.`First_Name`,
`Employees`.`Last_Name`,
`Hours`.`Clock_In`,
`Hours`.`Clock_Out`
FROM `Employees`
INNER JOIN `Hours` ON `Employees`.`ID` = `Hours`.`ID`
WHERE `Employees`.`First_Name` = 'Helmholtz';+------------+-----------+---------------------+---------------------+
| First_Name | Last_Name | Clock_In | Clock_Out |
+------------+-----------+---------------------+---------------------+
| Helmholtz | Watson | 2005-08-08 07:00:12 | 2005-08-08 17:01:02 |
| Helmholtz | Watson | 2005-08-09 07:03:44 | 2005-08-09 17:00:00 |
| Helmholtz | Watson | 2005-08-10 06:54:19 | 2005-08-10 17:03:31 |
| Helmholtz | Watson | 2005-08-11 07:00:05 | 2005-08-11 17:02:57 |
| Helmholtz | Watson | 2005-08-12 07:02:07 | 2005-08-12 16:58:23 |
+------------+-----------+---------------------+---------------------+
5 rows in set (0.00 sec)SELECT
`Employees`.`First_Name`,
`Employees`.`Last_Name`,
`Hours`.`Clock_In`,
`Hours`.`Clock_Out`
FROM `Employees`
INNER JOIN `Hours` ON `Employees`.`ID` = `Hours`.`ID`
WHERE `Employees`.`First_Name` = 'Helmholtz'
AND DATE_FORMAT(`Hours`.`Clock_In`, '%Y-%m-%d') >= '2005-08-08'
AND DATE_FORMAT(`Hours`.`Clock_In`, '%Y-%m-%d') <= '2005-08-12'
AND DATE_FORMAT(`Hours`.`Clock_In`, '%H:%i:%S') > '07:00:59';+------------+-----------+---------------------+---------------------+
| First_Name | Last_Name | Clock_In | Clock_Out |
+------------+-----------+---------------------+---------------------+
| Helmholtz | Watson | 2005-08-09 07:03:44 | 2005-08-09 17:00:00 |
| Helmholtz | Watson | 2005-08-12 07:02:07 | 2005-08-12 16:58:23 |
+------------+-----------+---------------------+---------------------+
2 rows in set (0.00 sec)SELECT
`Employees`.`ID`,
`Employees`.`First_Name`,
`Employees`.`Last_Name`,
`Hours`.`Clock_In`,
`Hours`.`Clock_Out`,
DATE_FORMAT(`Hours`.`Clock_Out`, '%T')-DATE_FORMAT(`Hours`.`Clock_In`, '%T')
AS 'Total_Hours'
FROM `Employees`
INNER JOIN `Hours` ON `Employees`.`ID` = `Hours`.`ID`;+----+------------+-----------+---------------------+---------------------+-------------+
| ID | First_Name | Last_Name | Clock_In | Clock_Out | Total_Hours |
+----+------------+-----------+---------------------+---------------------+-------------+
| 1 | Mustapha | Mond | 2005-08-08 07:00:42 | 2005-08-08 17:01:36 | 10 |
| 1 | Mustapha | Mond | 2005-08-09 07:01:34 | 2005-08-09 17:10:11 | 10 |
| 1 | Mustapha | Mond | 2005-08-10 06:59:56 | 2005-08-10 17:09:29 | 11 |
| 1 | Mustapha | Mond | 2005-08-11 07:00:17 | 2005-08-11 17:00:47 | 10 |
| 1 | Mustapha | Mond | 2005-08-12 07:02:29 | 2005-08-12 16:59:12 | 9 |
| 2 | Henry | Foster | 2005-08-08 07:00:25 | 2005-08-08 17:03:13 | 10 |
| 2 | Henry | Foster | 2005-08-09 07:00:57 | 2005-08-09 17:05:09 | 10 |
| 2 | Henry | Foster | 2005-08-10 06:58:43 | 2005-08-10 16:58:24 | 10 |
| 2 | Henry | Foster | 2005-08-11 07:01:58 | 2005-08-11 17:00:45 | 10 |
| 2 | Henry | Foster | 2005-08-12 07:02:12 | 2005-08-12 16:58:57 | 9 |
+----+------------+-----------+---------------------+---------------------+-------------+
10 rows in set (0.00 sec)-- Create a new database
CREATE DATABASE mydb;
-- Select the new database to use
USE mydb;
-- Create a new table
CREATE TABLE mytable (
id INT PRIMARY KEY,
name VARCHAR(20)
);
-- Insert some data
INSERT INTO mytable VALUES (1, 'Will');
INSERT INTO mytable VALUES (2, 'Marry');
INSERT INTO mytable VALUES (3, 'Dean');
-- Select specific data
SELECT id, name FROM mytable WHERE id = 1;
-- Update existing data
UPDATE mytable SET name = 'Willy' WHERE id = 1;
-- Select all data to see changes
SELECT id, name FROM mytable;
-- Delete specific data
DELETE FROM mytable WHERE id = 1;
-- Select all data again
SELECT id, name FROM mytable;
-- Drop the database (removes the database and its tables)
DROP DATABASE mydb;SELECT COUNT(*) FROM mytable; -- Or SELECT COUNT(1) FROM mytable;SELECT u.id, u.name, alliance.ally FROM users u JOIN alliance ON (u.id=alliance.userId) JOIN team ON (alliance.teamId=team.teamId WHERE team.teamName='Legionnaires' AND u.online=1 AND ((u.subscription='paid' AND u.paymentStatus='current') OR u.subscription='free') ORDER BY u.name;SELECT
u.id,
u.name,
alliance.ally
FROM
users u
JOIN alliance ON (u.id = alliance.userId)
JOIN team ON (alliance.teamId = team.teamId -- Error: Missing ')'
WHERE
team.teamName = 'Legionnaires'
AND u.online = 1
AND (
(u.subscription = 'paid' AND u.paymentStatus = 'current')
OR
u.subscription = 'free'
)
ORDER BY
u.name;SELECT *
FROM
financial_reportQ_1 AS a
JOIN sales_renderings AS b ON (a.salesGroup = b.groupId)
JOIN sales_agents AS c ON (b.groupId = c.group)
WHERE
b.totalSales > 10000
AND c.id != a.clientId;SELECT *
FROM financial_report_Q_1 AS frq1
JOIN sales_renderings AS sr ON frq1.salesGroup = sr.groupId
JOIN sales_agents AS sa ON sr.groupId = sa.group
WHERE sr.totalSales > 10000
AND sa.id != frq1.clientId;
Using initials or recognizable abbreviations (e.g., `frq1` for `financial_report_Q_1`) makes the query more understandable.
## Placing JOIN Conditions
The `ON` clause of a `JOIN` should specify the conditions that link the tables. Avoid using it for filtering rows that belong in the `WHERE` clause. Conversely, avoid placing all join logic in the `WHERE` clause (as common with older, implicit join syntax).
**Bad Example (join condition mixed in `WHERE`):**
```sql
SELECT *
FROM
family,
relationships
WHERE
family.personId = relationships.personId -- Join condition
AND relationships.relation = 'father'; -- Filtering conditionSELECT *
FROM
family
JOIN relationships ON (family.personId = relationships.personId) -- Join condition
WHERE
relationships.relation = 'father'; -- Filtering conditionSELECT * FROM someTable WHERE field = 'value -- Missing closing quoteSELECT * FROM someTable WHERE field = 1 GROUP BY id, -- Incomplete GROUP BYSELECT * FROM actionTable WHERE `DELETE` = 1; -- `DELETE` is a reserved word-- Example: Calculating a promised time 2 hours (7200 seconds) from current time
INSERT INTO tickets (client_id, urgency, trouble, ticket_date, entered, promised)
VALUES ('some_client', 'ASAP', 'Issue details',
CURDATE(), CURTIME(),
SEC_TO_TIME(TIME_TO_SEC(CURTIME()) + 7200));-- Corrected calculation for 'promised' TIME, wraps around 24 hours
SEC_TO_TIME((TIME_TO_SEC(CURTIME()) + 7200) % 86400)INSERT INTO tickets (client_id, urgency, trouble, entered, promised)
VALUES ('some_client', 'ASAP', 'Issue details',
NOW(),
DATE_ADD(NOW(), INTERVAL 2 HOUR));-- Add 2 hours and 30 minutes
DATE_ADD(NOW(), INTERVAL '2:30' HOUR_MINUTE)-- Add 5 days
DATE_ADD(NOW(), INTERVAL 5 DAY)-- Add 2 days and 6 hours
DATE_ADD(NOW(), INTERVAL '2 6' DAY_HOUR)-- Add 1 year and 2 months
DATE_ADD(NOW(), INTERVAL '1-2' YEAR_MONTH) -- Note: Original text used '1 2', '1-2' is common for YEAR_MONTH-- Subtract 5 days
DATE_ADD(NOW(), INTERVAL -5 DAY)-- Subtract 5 days
DATE_SUB(NOW(), INTERVAL 5 DAY)mariadb-dump --user=admin_backup --password --lock-tables --all-databases > /data/backup/dbs_alldatabases.sqlmariadb-dump --user=admin_backup --password=yoursecurepassword --lock-tables --extended-insert --all-databases > /data/backup/dbs_alldatabases.sqlmariadb-dump --user=admin_backup --password --lock-tables --extended-insert --databases your_database_name > /data/backup/your_database_name.sqlmariadb-dump --user=admin_backup --password --lock-tables --extended-insert --databases db1_name db2_name > /data/backup/selected_databases.sqlmariadb-dump --user=admin_backup --password --lock-tables --extended-insert your_database_name table_name1 table_name2 > /data/backup/your_database_name_selected_tables.sqlmariadb-dump --user=admin_backup --password --single-transaction --extended-insert --databases your_innodb_database > /data/backup/your_innodb_database.sqlCREATE TABLE `Employees` (
`ID` TINYINT(3) UNSIGNED NOT NULL AUTO_INCREMENT,
`First_Name` VARCHAR(25) NOT NULL,
`Last_Name` VARCHAR(25) NOT NULL,
`Position` VARCHAR(25) NOT NULL,
`Home_Address` VARCHAR(50) NOT NULL,
`Home_Phone` VARCHAR(12) NOT NULL,
PRIMARY KEY (`ID`)
) ENGINE=MyISAM;
INSERT INTO `Employees` (`First_Name`, `Last_Name`, `Position`, `Home_Address`, `Home_Phone`)
VALUES
('Mustapha', 'Mond', 'Chief Executive Officer', '692 Promiscuous Plaza', '326-555-3492'),
('Henry', 'Foster', 'Store Manager', '314 Savage Circle', '326-555-3847'),
('Bernard', 'Marx', 'Cashier', '1240 Ambient Avenue', '326-555-8456'),
('Lenina', 'Crowne', 'Cashier', '281 Bumblepuppy Boulevard', '328-555-2349'),
('Fanny', 'Crowne', 'Restocker', '1023 Bokanovsky Lane', '326-555-6329'),
('Helmholtz', 'Watson', 'Janitor', '944 Soma Court', '329-555-2478');CREATE TABLE `Hours` (
`ID` TINYINT(3) UNSIGNED NOT NULL,
`Clock_In` DATETIME NOT NULL,
`Clock_Out` DATETIME NOT NULL
) ENGINE=MyISAM;
INSERT INTO `Hours`
VALUES ('1', '2005-08-08 07:00:42', '2005-08-08 17:01:36'),
('1', '2005-08-09 07:01:34', '2005-08-09 17:10:11'),
('1', '2005-08-10 06:59:56', '2005-08-10 17:09:29'),
('1', '2005-08-11 07:00:17', '2005-08-11 17:00:47'),
('1', '2005-08-12 07:02:29', '2005-08-12 16:59:12'),
('2', '2005-08-08 07:00:25', '2005-08-08 17:03:13'),
('2', '2005-08-09 07:00:57', '2005-08-09 17:05:09'),
('2', '2005-08-10 06:58:43', '2005-08-10 16:58:24'),
('2', '2005-08-11 07:01:58', '2005-08-11 17:00:45'),
('2', '2005-08-12 07:02:12', '2005-08-12 16:58:57'),
('3', '2005-08-08 07:00:12', '2005-08-08 17:01:32'),
('3', '2005-08-09 07:01:10', '2005-08-09 17:00:26'),
('3', '2005-08-10 06:59:53', '2005-08-10 17:02:53'),
('3', '2005-08-11 07:01:15', '2005-08-11 17:04:23'),
('3', '2005-08-12 07:00:51', '2005-08-12 16:57:52'),
('4', '2005-08-08 06:54:37', '2005-08-08 17:01:23'),
('4', '2005-08-09 06:58:23', '2005-08-09 17:00:54'),
('4', '2005-08-10 06:59:14', '2005-08-10 17:00:12'),
('4', '2005-08-11 07:00:49', '2005-08-11 17:00:34'),
('4', '2005-08-12 07:01:09', '2005-08-12 16:58:29'),
('5', '2005-08-08 07:00:04', '2005-08-08 17:01:43'),
('5', '2005-08-09 07:02:12', '2005-08-09 17:02:13'),
('5', '2005-08-10 06:59:39', '2005-08-10 17:03:37'),
('5', '2005-08-11 07:01:26', '2005-08-11 17:00:03'),
('5', '2005-08-12 07:02:15', '2005-08-12 16:59:02'),
('6', '2005-08-08 07:00:12', '2005-08-08 17:01:02'),
('6', '2005-08-09 07:03:44', '2005-08-09 17:00:00'),
('6', '2005-08-10 06:54:19', '2005-08-10 17:03:31'),
('6', '2005-08-11 07:00:05', '2005-08-11 17:02:57'),
('6', '2005-08-12 07:02:07', '2005-08-12 16:58:23');SELECT
`Employees`.`First_Name`,
`Employees`.`Last_Name`,
`Hours`.`Clock_In`,
`Hours`.`Clock_Out`
FROM `Employees`
INNER JOIN `Hours` ON `Employees`.`ID` = `Hours`.`ID`
WHERE `Employees`.`First_Name` = 'Helmholtz'
AND DATE_FORMAT(`Hours`.`Clock_In`, '%Y-%m-%d') >= '2005-08-08'
AND DATE_FORMAT(`Hours`.`Clock_In`, '%Y-%m-%d') <= '2005-08-12'
AND DATE_FORMAT(`Hours`.`Clock_In`, '%H:%i:%S') > '07:00:59';+------------+-----------+---------------------+---------------------+
| First_Name | Last_Name | Clock_In | Clock_Out |
+------------+-----------+---------------------+---------------------+
| Helmholtz | Watson | 2005-08-09 07:03:44 | 2005-08-09 17:00:00 |
| Helmholtz | Watson | 2005-08-12 07:02:07 | 2005-08-12 16:58:23 |
+------------+-----------+---------------------+---------------------+SELECT
`Employees`.`First_Name`,
`Employees`.`Last_Name`,
`Hours`.`Clock_In`,
`Hours`.`Clock_Out`,
(601 - TIMESTAMPDIFF(MINUTE, `Hours`.`Clock_In`, `Hours`.`Clock_Out`)) AS Difference -- Corrected Difference Calculation
FROM `Employees`
INNER JOIN `Hours` USING (`ID`) -- Simplified JOIN condition
WHERE DATE_FORMAT(`Hours`.`Clock_In`, '%Y-%m-%d') BETWEEN '2005-08-08' AND '2005-08-12'
AND TIME(`Hours`.`Clock_In`) > '07:00:59'
AND TIMESTAMPDIFF(MINUTE, `Hours`.`Clock_In`, `Hours`.`Clock_Out`) < 601;+------------+-----------+---------------------+---------------------+------------+
| First_Name | Last_Name | Clock_In | Clock_Out | Difference |
+------------+-----------+---------------------+---------------------+------------+
| Mustapha | Mond | 2005-08-12 07:02:29 | 2005-08-12 16:59:12 | 4 |
... (other rows matching the criteria)
+------------+-----------+---------------------+---------------------+------------+CREATE SQL SECURITY INVOKER VIEW Employee_Tardiness AS
SELECT
`Employees`.`First_Name`,
`Employees`.`Last_Name`,
`Hours`.`Clock_In`,
`Hours`.`Clock_Out`,
(601 - TIMESTAMPDIFF(MINUTE, `Hours`.`Clock_In`, `Hours`.`Clock_Out`)) AS Difference
FROM `Employees`
INNER JOIN `Hours` USING (`ID`)
WHERE DATE_FORMAT(`Hours`.`Clock_In`, '%Y-%m-%d') BETWEEN '2005-08-08' AND '2005-08-12'
AND TIME(`Hours`.`Clock_In`) > '07:00:59'
AND TIMESTAMPDIFF(MINUTE, `Hours`.`Clock_In`, `Hours`.`Clock_Out`) < 601;SELECT * FROM Employee_Tardiness;SELECT * FROM Employee_Tardiness WHERE Difference >= 5;+------------+-----------+---------------------+---------------------+------------+
| First_Name | Last_Name | Clock_In | Clock_Out | Difference |
+------------+-----------+---------------------+---------------------+------------+
| Mustapha | Mond | 2005-08-12 07:02:29 | 2005-08-12 16:59:12 | 5 |
... (other rows where Difference >= 5)
+------------+-----------+---------------------+---------------------+------------+mariadb -u user_name -p -h ip_address db_nameMariaDB [test]>CREATE DATABASE IF NOT EXISTS test;
USE test;
CREATE TABLE IF NOT EXISTS books (
BookID INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
Title VARCHAR(100) NOT NULL,
SeriesID INT, AuthorID INT);
CREATE TABLE IF NOT EXISTS authors
(id INT NOT NULL PRIMARY KEY AUTO_INCREMENT);
CREATE TABLE IF NOT EXISTS series
(id INT NOT NULL PRIMARY KEY AUTO_INCREMENT);
INSERT INTO books (Title,SeriesID,AuthorID)
VALUES('The Fellowship of the Ring',1,1),
('The Two Towers',1,1), ('The Return of the King',1,1),
('The Sum of All Men',2,2), ('Brotherhood of the Wolf',2,2),
('Wizardborn',2,2), ('The Hobbbit',0,1);SHOW TABLES;
+----------------+
| Tables_in_test |
+----------------+
| authors |
| books |
| series |
+----------------+
3 rows in set (0.00 sec)DESCRIBE books;
+----------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+----------------+
| BookID | int(11) | NO | PRI | NULL | auto_increment |
| Title | varchar(100) | NO | | NULL | |
| SeriesID | int(11) | YES | | NULL | |
| AuthorID | int(11) | YES | | NULL | |
+----------+--------------+------+-----+---------+----------------+SELECT * FROM books;
+--------+----------------------------+----------+----------+
| BookID | Title | SeriesID | AuthorID |
+--------+----------------------------+----------+----------+
| 1 | The Fellowship of the Ring | 1 | 1 |
| 2 | The Two Towers | 1 | 1 |
| 3 | The Return of the King | 1 | 1 |
| 4 | The Sum of All Men | 2 | 2 |
| 5 | Brotherhood of the Wolf | 2 | 2 |
| 6 | Wizardborn | 2 | 2 |
| 7 | The Hobbbit | 0 | 1 |
+--------+----------------------------+----------+----------+
7 rows in set (0.00 sec)INSERT INTO books (Title, SeriesID, AuthorID)
VALUES ("Lair of Bones", 2, 2);
Query OK, 1 row affected (0.00 sec)SELECT * FROM books;UPDATE books
SET Title = "The Hobbit"
WHERE BookID = 7;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0mariadb -u root -p -h localhostCREATE DATABASE bookstore;
USE bookstore;CREATE TABLE books (
isbn CHAR(20) PRIMARY KEY,
title VARCHAR(50),
author_id INT,
publisher_id INT,
year_pub CHAR(4),
description TEXT );DESCRIBE books;
+--------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+-------+
| isbn | char(20) | NO | PRI | NULL | |
| title | varchar(50) | YES | | NULL | |
| author_id | int(11) | YES | | NULL | |
| publisher_id | int(11) | YES | | NULL | |
| year_pub | char(4) | YES | | NULL | |
| description | text | YES | | NULL | |
+--------------+-------------+------+-----+---------+-------+CREATE TABLE authors
(author_id INT AUTO_INCREMENT PRIMARY KEY,
name_last VARCHAR(50),
name_first VARCHAR(50),
country VARCHAR(50) );INSERT INTO authors
(name_last, name_first, country)
VALUES('Kafka', 'Franz', 'Czech Republic');INSERT INTO books
(title, author_id, isbn, year_pub)
VALUES('The Castle', '1', '0805211063', '1998');INSERT INTO books
(title, author_id, isbn, year_pub)
VALUES('The Trial', '1', '0805210407', '1995'),
('The Metamorphosis', '1', '0553213695', '1995'),
('America', '1', '0805210644', '1995');SELECT title
FROM books;SELECT title
FROM books
LIMIT 5;SELECT title, name_last
FROM books
JOIN authors USING (author_id);SELECT title AS 'Kafka Books'
FROM books
JOIN authors USING (author_id)
WHERE name_last = 'Kafka';
+-------------------+
| Kafka Books |
+-------------------+
| The Castle |
| The Trial |
| The Metamorphosis |
| America |
+-------------------+UPDATE books
SET title = 'Amerika'
WHERE isbn = '0805210644';DELETE FROM books
WHERE author_id = '2034';SELECT u.id, u.name, alliance.ally FROM users u JOIN alliance ON
(u.id=alliance.userId) JOIN team ON (alliance.teamId=team.teamId
WHERE team.teamName='Legionnaires' AND u.online=1 AND ((u.subscription='paid'
AND u.paymentStatus='current') OR u.subscription='free') ORDER BY u.name;SELECT
u.id
, u.name
, alliance.ally
FROM
users u
JOIN alliance ON (u.id = alliance.userId)
JOIN team ON (alliance.teamId = team.teamId
WHERE
team.teamName = 'Legionnaires'
AND u.online = 1
AND (
(u.subscription = 'paid' AND u.paymentStatus = 'current')
OR
u.subscription = 'free'
)
ORDER BY
u.name;SELECT *
FROM
financial_reportQ_1 AS a
JOIN sales_renderings AS b ON (a.salesGroup = b.groupId)
JOIN sales_agents AS c ON (b.groupId = c.group)
WHERE
b.totalSales > 10000
AND c.id != a.clientIdSELECT *
FROM
financial_report_Q_1 AS frq1
JOIN sales_renderings AS sr ON (frq1.salesGroup = sr.groupId)
JOIN sales_agents AS sa ON (sr.groupId = sa.group)
WHERE
sr.totalSales > 10000
AND sa.id != frq1.clientIdSELECT *
FROM
family,
relationships
WHERE
family.personId = relationships.personId
AND relationships.relation = 'father'SELECT *
FROM
family
JOIN relationships ON (family.personId = relationships.personId)
WHERE
relationships.relation = 'father'ERROR 1064: You have an error in your SQL syntax; check the manual that corresponds to your
MariaDB server version for the right syntax to use near ' ' at line 1SELECT * FROM someTable WHERE field = 'valueSELECT * FROM someTable WHERE field = 1 GROUP BY id,SELECT * FROM actionTable WHERE `DELETE` = 1;SELECT * FROM a, b JOIN c ON a.x = c.x;SELECT * FROM someTable WHERE someId IN (SELECT id FROM someLookupTable);SELECT * FROM tableA JOIN tableB ON tableA.x = tableB.y;CREATE TABLE t1 ( a INT );
CREATE TABLE t2 ( b INT );
CREATE TABLE student_tests (
name CHAR(10), test CHAR(10),
score TINYINT, test_date DATE
);INSERT INTO t1 VALUES (1), (2), (3);
INSERT INTO t2 VALUES (2), (4);
INSERT INTO student_tests
(name, test, score, test_date) VALUES
('Chun', 'SQL', 75, '2012-11-05'),
('Chun', 'Tuning', 73, '2013-06-14'),
('Esben', 'SQL', 43, '2014-02-11'),
('Esben', 'Tuning', 31, '2014-02-09'),
('Kaolin', 'SQL', 56, '2014-01-01'),
('Kaolin', 'Tuning', 88, '2013-12-29'),
('Tatiana', 'SQL', 87, '2012-04-28'),
('Tatiana', 'Tuning', 83, '2013-09-30');CREATE TABLE student_details (
id INT NOT NULL AUTO_INCREMENT, name CHAR(10),
date_of_birth DATE, PRIMARY KEY (id)
);INSERT INTO student_details (name,date_of_birth) VALUES
('Chun', '1993-12-31'),
('Esben','1946-01-01'),
('Kaolin','1996-07-16'),
('Tatiana', '1988-04-13');
SELECT * FROM student_details;
+----+---------+---------------+
| id | name | date_of_birth |
+----+---------+---------------+
| 1 | Chun | 1993-12-31 |
| 2 | Esben | 1946-01-01 |
| 3 | Kaolin | 1996-07-16 |
| 4 | Tatiana | 1988-04-13 |
+----+---------+---------------+SELECT * FROM t1 INNER JOIN t2 ON t1.a = t2.b;SELECT MAX(a) FROM t1;
+--------+
| MAX(a) |
+--------+
| 3 |
+--------+SELECT MIN(a) FROM t1;
+--------+
| MIN(a) |
+--------+
| 1 |
+--------+SELECT AVG(a) FROM t1;
+--------+
| AVG(a) |
+--------+
| 2.0000 |
+--------+SELECT name, MAX(score) FROM student_tests GROUP BY name;
+---------+------------+
| name | MAX(score) |
+---------+------------+
| Chun | 75 |
| Esben | 43 |
| Kaolin | 88 |
| Tatiana | 87 |
+---------+------------+SELECT name, test, score FROM student_tests ORDER BY score DESC;
+---------+--------+-------+
| name | test | score |
+---------+--------+-------+
| Kaolin | Tuning | 88 |
| Tatiana | SQL | 87 |
| Tatiana | Tuning | 83 |
| Chun | SQL | 75 |
| Chun | Tuning | 73 |
| Kaolin | SQL | 56 |
| Esben | SQL | 43 |
| Esben | Tuning | 31 |
+---------+--------+-------+SELECT name,test, score FROM student_tests WHERE score=(SELECT MIN(score) FROM student);
+-------+--------+-------+
| name | test | score |
+-------+--------+-------+
| Esben | Tuning | 31 |
+-------+--------+-------+SELECT name, test, score FROM student_tests st1 WHERE score = (
SELECT MAX(score) FROM student st2 WHERE st1.name = st2.name
);
+---------+--------+-------+
| name | test | score |
+---------+--------+-------+
| Chun | SQL | 75 |
| Esben | SQL | 43 |
| Kaolin | Tuning | 88 |
| Tatiana | SQL | 87 |
+---------+--------+-------+SELECT CURDATE() AS today;
+------------+
| today |
+------------+
| 2014-02-17 |
+------------+
SELECT name, date_of_birth, TIMESTAMPDIFF(YEAR,date_of_birth,'2014-08-02') AS age
FROM student_details;
+---------+---------------+------+
| name | date_of_birth | age |
+---------+---------------+------+
| Chun | 1993-12-31 | 20 |
| Esben | 1946-01-01 | 68 |
| Kaolin | 1996-07-16 | 18 |
| Tatiana | 1988-04-13 | 26 |
+---------+---------------+------+SELECT @avg_score:= AVG(score) FROM student_tests;
+-------------------------+
| @avg_score:= AVG(score) |
+-------------------------+
| 67.000000000 |
+-------------------------+
SELECT * FROM student_tests WHERE score > @avg_score;
+---------+--------+-------+------------+
| name | test | score | test_date |
+---------+--------+-------+------------+
| Chun | SQL | 75 | 2012-11-05 |
| Chun | Tuning | 73 | 2013-06-14 |
| Kaolin | Tuning | 88 | 2013-12-29 |
| Tatiana | SQL | 87 | 2012-04-28 |
| Tatiana | Tuning | 83 | 2013-09-30 |
+---------+--------+-------+------------+SET @count = 0;
SELECT @count := @count + 1 AS counter, name, date_of_birth FROM student_details;
+---------+---------+---------------+
| counter | name | date_of_birth |
+---------+---------+---------------+
| 1 | Chun | 1993-12-31 |
| 2 | Esben | 1946-01-01 |
| 3 | Kaolin | 1996-07-16 |
| 4 | Tatiana | 1988-04-13 |
+---------+---------+---------------+SELECT table_schema AS `DB`, table_name AS `TABLE`,
ROUND(((data_length + index_length) / 1024 / 1024), 2) `Size (MB)`
FROM information_schema.TABLES
ORDER BY (data_length + index_length) DESC;
+--------------------+---------------------------------------+-----------+
| DB | Table | Size (MB) |
+--------------------+---------------------------------------+-----------+
| wordpress | wp_simple_history_contexts | 7.05 |
| wordpress | wp_posts | 6.59 |
| wordpress | wp_simple_history | 3.05 |
| wordpress | wp_comments | 2.73 |
| wordpress | wp_commentmeta | 2.47 |
| wordpress | wp_simple_login_log | 2.03 |
...CREATE TABLE t (id INT, f1 VARCHAR(2));
INSERT INTO t VALUES (1,'a'), (2,'a'), (3,'b'), (4,'a');
SELECT * FROM t t1, t t2 WHERE t1.f1=t2.f1 AND t1.id<>t2.id AND t1.id=(
SELECT MAX(id) FROM t tab WHERE tab.f1=t1.f1
);
+------+------+------+------+
| id | f1 | id | f1 |
+------+------+------+------+
| 4 | a | 1 | a |
| 4 | a | 2 | a |
+------+------+------+------+
DELETE FROM t WHERE id IN (
SELECT t2.id FROM t t1, t t2 WHERE t1.f1=t2.f1 AND t1.id<>t2.id AND t1.id=(
SELECT MAX(id) FROM t tab WHERE tab.f1=t1.f1
)
);
Query OK, 2 rows affected (0.120 sec)
SELECT * FROM t;
+------+------+
| id | f1 |
+------+------+
| 3 | b |
| 4 | a |
+------+------SELECT CONCAT(name_first, ' ', name_last)
AS Name
FROM contacts;SELECT CONCAT_WS('|', col1, col2, col3)
FROM table1;SELECT CONCAT('$', FORMAT(col5, 2))
FROM table3;SELECT UCASE(col1),
LCASE(col2)
FROM table4;SELECT RPAD(part_nbr, 8, '.') AS 'Part Nbr.',
LPAD(description, 15, '_') AS Description
FROM catalog;SELECT TRIM(LEADING '.' FROM col1),
TRIM(TRAILING FROM col2),
TRIM(BOTH '_' FROM col3),
TRIM(col4)
FROM table5;SELECT LEFT(telephone, 3) AS area_code,
RIGHT(telephone, 7) AS tel_nbr
FROM contacts
ORDER BY area_code;SELECT CONCAT('(', LEFT(telephone, 3), ') ',
SUBSTRING(telephone, 4, 3), '-',
MID(telephone, 7)) AS 'Telephone Number'
FROM contacts
ORDER BY LEFT(telephone, 3);SELECT CONCAT(REPLACE(title, 'Mrs.', 'Ms.'),
' ', name_first, ' ', name_last) AS Name
FROM contacts;SELECT INSERT(name, LOCATE(name, 'Mrs.'), 4, 'Ms.')
FROM contacts;SELECT REPEAT(col1, 2)
FROM table1;SELECT COUNT(school_id)
AS 'Number of Students'
FROM table8
WHERE CHAR_LENGTH(school_id)=8;SELECT ip_address
FROM computers WHERE server='Y'
ORDER BY ip_address LIMIT 3;
+-------------+
| ip_address |
+-------------+
| 10.0.1.1 |
| 10.0.11.1 |
| 10.0.2.1 |
+-------------+SELECT ip_address
FROM computers WHERE server='Y'
ORDER BY INET_ATON(ip_address) LIMIT 3;SELECT col1, col2
FROM table6
WHERE STRCMP(col3, 'text')=0;SELECT SUBSTRING_INDEX(col4, '|', 2)
FROM table7;INSERT table1
VALUES('text1','text2','text3');INSERT INTO table1
(col3, col1)
VALUES('text3','text1');INSERT IGNORE
INTO table2
VALUES('id1','text','text'),
('id2','text','text'),
('id2','text','text');INSERT LOW_PRIORITY
INTO table1
VALUES('text1','text2','text3');INSERT DELAYED
INTO table1
VALUES('text1','text2','text3');INSERT INTO softball_team
(last, first, telephone)
SELECT name_last, name_first, tel_home
FROM company.employees
WHERE softball='Y';REPLACE LOW_PRIORITY
INTO table2 (id, col1, col2)
VALUES('id1','text','text'),
('id2','text','text'),
('id3','text','text');UPDATE LOW_PRIORITY table3
SET col1 = 'text-a', col2='text-b'
WHERE id < 100;UPDATE table5
SET col_date = DATE_ADD(col_date, INTERVAL 1 DAY)
WHERE DAYOFWEEK(col_date) = 1;UPDATE LOW_PRIORITY table3
SET col1='text-a', col2='text-b'
WHERE id < 100
ORDER BY col3 DESC
LIMIT 10;UPDATE table3, table4
SET table3.col1 = table4.col1
WHERE table3.id = table4.id;INSERT IGNORE INTO table1
(id, col1, col2, status)
VALUES('1012','text','text','new'),
('1025,'text','text','new'),
('1030,'text','text','new')
ON DUPLICATE KEY
UPDATE status = 'old';INSERT INTO billable_work
(doctor_id, patient_id, session_date)
VALUES('1021', '1256', CURRENT_DATE);SELECT rec_id, doctor_id,
patient_id, session_date
FROM billable_work
WHERE rec_id=LAST_INSERT_ID();
+--------+-----------+------------+--------------+
| rec_id | doctor_id | patient_id | session_date |
+--------+-----------+------------+--------------+
| 2462 | 1021 | 1256 | 2017-08-23 |
+--------+-----------+------------+--------------+UPDATE billable_work
SET session_time=CURTIME()
WHERE rec_id='2462';
SELECT patient_id, session_date, session_time
FROM billable_work
WHERE rec_id='2462';
+------------+--------------+--------------+
| patient_id | session_date | session_time |
+------------+--------------+--------------+
| 1256 | 2017-08-23 | 10:30:23 |
+------------+--------------+--------------+SELECT MONTH(session_date) AS Month,
DAYOFMONTH(session_date) AS Day,
YEAR(session_date) AS Year
FROM billable_work
WHERE rec_id='2462';
+-------+------+------+
| Month | Day | Year |
+-------+------+------+
| 8 | 23 | 2017 |
+-------+------+------+SELECT patient_id AS 'Patient ID',
session_date AS 'Date of Session',
IF(DAYOFWEEK(session_date)=6, 1.5, 1.0)
AS 'Billing Rate'
FROM billable_work
WHERE rec_id='2462';
+-------------+-----------------+--------------+
| Patient ID | Date of Session | Billing Rate |
+-------------+-----------------+--------------+
| 1256 | 2017-08-23 | 1.5 |
+-------------+-----------------+--------------+SET @LASTQTR:=IF((QUARTER(CURDATE())-1)=0,
4, QUARTER(CURDATE())-1);
SET @YR:=IF(@LASTQTR=4,
YEAR(NOW())-1, YEAR(NOW()));
SELECT patient_id AS 'Patient ID',
COUNT(session_time)
AS 'Number of Sessions'
FROM billable_work
WHERE QUARTER(session_date) = @LASTQTR
AND YEAR(session_date) = @YR
AND doctor_id='1021'
GROUP BY patient_id
ORDER BY patient_id LIMIT 5;
+------------+--------------------+
| Patient ID | Number of Sessions |
+------------+--------------------+
| 1104 | 10 |
| 1142 | 7 |
| 1203 | 18 |
| 1244 | 6 |
| 1256 | 12 |
+------------+--------------------+SELECT HOUR(session_time) AS Hour,
MINUTE(session_time) AS Minute,
SECOND(session_time) AS Second
FROM billable_work
WHERE rec_id='2462';
+------+--------+--------+
| Hour | Minute | Second |
+------+--------+--------+
| 10 | 30 | 00 |
+------+--------+--------+SELECT patient_name AS Patient,
EXTRACT(HOUR FROM appointment) AS Hour,
EXTRACT(MINUTE FROM appointment) AS Minute
FROM billable_work, patients
WHERE doctor_id='1021'
AND EXTRACT(MONTH FROM appointment)='8'
AND EXTRACT(DAY FROM appointment)='30'
AND billable_work.patient_id =
patients.patient_id;+-------------------+------+--------+
| Patient | Hour | Minute |
+-------------------+------+--------+
| Michael Zabalaoui | 10 | 00 |
| Jerry Neumeyer | 11 | 00 |
| Richard Stringer | 13 | 30 |
| Janice Sogard | 14 | 30 |
+-------------------+------+--------+...
EXTRACT(HOUR_MINUTE FROM appointment)
AS Appointment
...
+-------------------+-------------+
| Patient | Appointment |
+-------------------+-------------+
| Michael Zabalaoui | 1000 |
| Jerry Neumeyer | 1100 |
| Richard Stringer | 1330 |
| Janice Sogard | 1430 |
+-------------------+-------------+SELECT patient_name AS Patient,
CONCAT(DAYNAME(appointment), ' - ',
MONTHNAME(appointment), ' ',
DAYOFMONTH(appointment), ', ',
YEAR(appointment)) AS Appointment
FROM billable_work, patients
WHERE doctor_id='1021'
AND billable_work.patient_id =
patients.patient_id
AND appointment>'2017-08-01'
AND appointment<'2017-08-31'
LIMIT 1;
+-------------------+-----------------------------+
| Patient | Appointment |
+-------------------+-----------------------------+
| Michael Zabalaoui | Wednesday - August 30, 2017 |
+-------------------+-----------------------------+SELECT patient_name AS Patient,
DATE_FORMAT(appointment, '%W - %M %e, %Y')
AS Appointment
FROM billable_work, patients
WHERE doctor_id='1021'
AND billable_work.patient_id =
patients.patient_id
AND DATE_FORMAT(appointment, '%c') = 8
LIMIT 1;SELECT
DATE_FORMAT(appointment, '%W - %M %e, %Y at %r')
AS Appointment
...
+--------------------------------------------+
| Appointment |
+--------------------------------------------+
| Wednesday - August 30, 2017 at 02:11:19 AM |
+--------------------------------------------+SELECT patient_name AS Patient,
TIME_FORMAT(appointment, '%l:%i %p')
AS Appointment
FROM billable_work, patients
WHERE doctor_id='1021'
AND billable_work.patient_id =
patients.patient_id
AND DATE_FORMAT(appointment, '%Y-%m-%d') =
CURDATE();
+-------------------+-------------+
| Patient | Appointment |
+-------------------+-------------+
| Michael Zabalaoui | 10:00 AM |
| Jerry Neumeyer | 11:00 AM |
| Richard Stringer | 01:30 PM |
| Janice Sogard | 02:30 PM |
+-------------------+-------------+CREATE OR REPLACE TABLE books (
isbn CHAR(20) PRIMARY KEY,
title VARCHAR(50),
author_id INT,
publisher_id INT,
year_pub CHAR(4),
description TEXT );
CREATE OR REPLACE TABLE authors
(author_id INT AUTO_INCREMENT PRIMARY KEY,
name_last VARCHAR(50),
name_first VARCHAR(50),
country VARCHAR(50) );
INSERT INTO authors (name_last, name_first, country) VALUES
('Kafka', 'Franz', 'Czech Republic'),
('Dostoevsky', 'Fyodor', 'Russia');
INSERT INTO books (title, author_id, isbn, year_pub) VALUES
('The Trial', 1, '0805210407', '1995'),
('The Metamorphosis', 1, '0553213695', '1995'),
('America', 2, '0805210644', '1995'),
('Brothers Karamozov', 2, '0553212168', ''),
('Crime & Punishment', 2, '0679420290', ''),
('Crime & Punishment', 2, '0553211757', ''),
('Idiot', 2, '0192834118', ''),
('Notes from Underground', 2, '067973452X', '');SELECT * FROM books;+------------+------------------------+-----------+--------------+----------+-------------+
| isbn | title | author_id | publisher_id | year_pub | description |
+------------+------------------------+-----------+--------------+----------+-------------+
| 0192834118 | Idiot | 2 | NULL | | NULL |
| 0553211757 | Crime & Punishment | 2 | NULL | | NULL |
| 0553212168 | Brothers Karamozov | 2 | NULL | | NULL |
| 0553213695 | The Metamorphosis | 1 | NULL | 1995 | NULL |
| 0679420290 | Crime & Punishment | 2 | NULL | | NULL |
| 067973452X | Notes from Underground | 2 | NULL | | NULL |
| 0805210407 | The Trial | 1 | NULL | 1995 | NULL |
| 0805210644 | America | 2 | NULL | 1995 | NULL |
+------------+------------------------+-----------+--------------+----------+-------------+
8 rows in set (0.001 sec)SELECT isbn, title, author_id
FROM books;+------------+------------------------+-----------+
| isbn | title | author_id |
+------------+------------------------+-----------+
| 0192834118 | Idiot | 2 |
| 0553211757 | Crime & Punishment | 2 |
| 0553212168 | Brothers Karamozov | 2 |
| 0553213695 | The Metamorphosis | 1 |
| 0679420290 | Crime & Punishment | 2 |
| 067973452X | Notes from Underground | 2 |
| 0805210407 | The Trial | 1 |
| 0805210644 | America | 2 |
+------------+------------------------+-----------+
8 rows in set (0.001 sec)SELECT isbn, title, author_id
FROM books
LIMIT 5;+------------+--------------------+-----------+
| isbn | title | author_id |
+------------+--------------------+-----------+
| 0192834118 | Idiot | 2 |
| 0553211757 | Crime & Punishment | 2 |
| 0553212168 | Brothers Karamozov | 2 |
| 0553213695 | The Metamorphosis | 1 |
| 0679420290 | Crime & Punishment | 2 |
+------------+--------------------+-----------+
5 rows in set (0.001 sec)SELECT isbn, title, author_id
FROM books
LIMIT 5, 10;+------------+------------------------+-----------+
| isbn | title | author_id |
+------------+------------------------+-----------+
| 067973452X | Notes from Underground | 2 |
| 0805210407 | The Trial | 1 |
| 0805210644 | America | 2 |
+------------+------------------------+-----------+
3 rows in set (0.001 sec)SELECT isbn, title
FROM books
WHERE author_id = 2
LIMIT 5;+------------+------------------------+
| isbn | title |
+------------+------------------------+
| 0192834118 | Idiot |
| 0553211757 | Crime & Punishment |
| 0553212168 | Brothers Karamozov |
| 0679420290 | Crime & Punishment |
| 067973452X | Notes from Underground |
+------------+------------------------+
5 rows in set (0.000 sec)SELECT isbn, title
FROM books
WHERE author_id = 2
ORDER BY title ASC
LIMIT 5;+------------+--------------------+
| isbn | title |
+------------+--------------------+
| 0805210644 | America |
| 0553212168 | Brothers Karamozov |
| 0553211757 | Crime & Punishment |
| 0679420290 | Crime & Punishment |
| 0192834118 | Idiot |
+------------+--------------------+
5 rows in set (0.001 sec)SELECT isbn, title,
CONCAT(name_first, ' ', name_last) AS author
FROM books
JOIN authors USING (author_id)
WHERE name_last = 'Dostoevsky'
ORDER BY title ASC
LIMIT 5;+------------+--------------------+-------------------+
| isbn | title | author |
+------------+--------------------+-------------------+
| 0805210644 | America | Fyodor Dostoevsky |
| 0553212168 | Brothers Karamozov | Fyodor Dostoevsky |
| 0553211757 | Crime & Punishment | Fyodor Dostoevsky |
| 0679420290 | Crime & Punishment | Fyodor Dostoevsky |
| 0192834118 | Idiot | Fyodor Dostoevsky |
+------------+--------------------+-------------------+
5 rows in set (0.00 sec)...
JOIN authors ON author_id = row_id
...SELECT isbn, title,
CONCAT(name_first, ' ', name_last) AS author
FROM books
JOIN authors USING (author_id)
WHERE name_last LIKE 'Dostoevsk%'
ORDER BY title ASC
LIMIT 5;+------------+--------------------+-------------------+
| isbn | title | author |
+------------+--------------------+-------------------+
| 0805210644 | America | Fyodor Dostoevsky |
| 0553212168 | Brothers Karamozov | Fyodor Dostoevsky |
| 0553211757 | Crime & Punishment | Fyodor Dostoevsky |
| 0679420290 | Crime & Punishment | Fyodor Dostoevsky |
| 0192834118 | Idiot | Fyodor Dostoevsky |
+------------+--------------------+-------------------+
5 rows in set (0.001 sec)SELECT DISTINCT title
FROM books
JOIN authors USING (author_id)
WHERE name_last = 'Dostoevsky'
ORDER BY title;+------------------------+
| title |
+------------------------+
| America |
| Brothers Karamozov |
| Crime & Punishment |
| Idiot |
| Notes from Underground |
+------------------------+SELECT DISTINCT HIGH_PRIORITY title
FROM books
JOIN authors USING (author_id)
WHERE name_last = 'Dostoevsky'
ORDER BY title;+------------------------+
| title |
+------------------------+
| America |
| Brothers Karamozov |
| Crime & Punishment |
| Idiot |
| Notes from Underground |
+------------------------+SELECT SQL_CALC_FOUND_ROWS isbn, title
FROM books
JOIN authors USING (author_id)
WHERE name_last = 'Dostoevsky'
LIMIT 5;+------------+------------------------+
| isbn | title |
+------------+------------------------+
| 0192834118 | Idiot |
| 0553211757 | Crime & Punishment |
| 0553212168 | Brothers Karamozov |
| 0679420290 | Crime & Punishment |
| 067973452X | Notes from Underground |
+------------+------------------------+
5 rows in set (0.001 sec)SELECT FOUND_ROWS();+--------------+
| FOUND_ROWS() |
+--------------+
| 6 |
+--------------+
1 row in set (0.000 secCREATE USER 'mariabackup'@'localhost' IDENTIFIED BY 'mbu_passwd';
GRANT RELOAD, PROCESS, LOCK TABLES, BINLOG MONITOR
ON * TO 'mariabackup'@'localhost';mariadb-dump db_name > backup-file.sqlmariadb db_name < backup-file.sqlmariadb-hotcopy db_name [/path/to/new_directory]
mariadb-hotcopy db_name_1 ... db_name_n /path/to/new_directorymariadb-backup --move-back --target-dir=/data/backups/fullmariadb-backup --backup \
--target-dir=/data/backups/full \
--user=mariadb-backup \
--password=mbu_passwd \
--parallel=12mariadb-backup --backup \
--incremental-basedir=/data/backups/inc1 \
--target-dir=/data/backups/inc2 \
--user=mariadb-backup \
--password=mbu_passwdmariadb-backup --prepare \
--target-dir=/data/backups/full \
--incremental-dir=/data/backups/inc1mariadb-backup --prepare \
--target-dir=/data/backups/full \
--incremental-dir=/data/backups/inc2mariadb-backup --copy-back --target-dir=/data/backups/full
chown -R mysql:mysql /var/lib/mysql$ mariadb-backup --backup \
--target-dir=/var/mariadb/backup/ \
--user=mariadb-backup --password=mypassword$ ls /var/mariadb/backup/
aria_log.0000001 mysql xtrabackup_checkpoints
aria_log_control performance_schema xtrabackup_info
backup-my.cnf test xtrabackup_logfile
ibdata1 xtrabackup_binlog_info$ mariadb-backup --backup \
--target-dir=/var/mariadb/backup/ \
--user=mariadb-backup --password=mypassword \
--history=full_backup_weekly$ mariadb-backup --prepare \
--target-dir=/var/mariadb/backup/$ mariadb-backup --copy-back \
--target-dir=/var/mariadb/backup/$ chown -R mysql:mysql /var/lib/mysql/$ rsync -avrP /var/mariadb/backup /var/lib/mysql/
$ chown -R mysql:mysql /var/lib/mysql/cat /data/backups/full/xtraback_binlog_info
mariadb-node4.00001 321[mysqld]
datadir=/var/lib/mysql_newsystemctl start mariadb$ mysqlbinlog --start-position=321 \
--stop-datetime="2019-06-28 12:00:00" \
/var/lib/mysql/mariadb-node4.00001 \
> mariadb-binlog.sql$ mariadb < mariadb-binlog.sqlmariadb-dump -u root -p --all-databases --no-data > nodata.sqlsed -n '/Current Database: `DATABASENAME`/, /Current Database:/p' nodata.sql > trimednodata.sql
vim trimednodata.sqlmariadb-backup --prepare --export --target-dir=/media/backups/fullbackupfoldermysql -u root -p schema_name < nodata.sqlSELECT ...
INTO OUTFILE '/tmp/filename.SQL'
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
FROM ...USE information_schema;
SELECT concat("ALTER TABLE ",table_name," DISCARD TABLESPACE;") AS discard_tablespace
FROM information_schema.tables
WHERE TABLE_SCHEMA="DATABASENAME";
SELECT concat("ALTER TABLE ",table_name," IMPORT TABLESPACE;") AS import_tablespace
FROM information_schema.tables
WHERE TABLE_SCHEMA="DATABASENAME";
SELECT
CONCAT ("ALTER TABLE ", rc.CONSTRAINT_SCHEMA, ".",rc.TABLE_NAME," DROP FOREIGN KEY ", rc.CONSTRAINT_NAME,";") AS drop_keys
FROM REFERENTIAL_CONSTRAINTS AS rc
WHERE CONSTRAINT_SCHEMA = 'DATABASENAME';
SELECT
CONCAT ("ALTER TABLE ",
KCU.CONSTRAINT_SCHEMA, ".",
KCU.TABLE_NAME,"
ADD CONSTRAINT ",
KCU.CONSTRAINT_NAME, "
FOREIGN KEY ", "
(`",KCU.COLUMN_NAME,"`)", "
REFERENCES `",REFERENCED_TABLE_NAME,"`
(`",REFERENCED_COLUMN_NAME,"`)" ,"
ON UPDATE " ,(SELECT UPDATE_RULE FROM REFERENTIAL_CONSTRAINTS WHERE CONSTRAINT_NAME = KCU.CONSTRAINT_NAME AND CONSTRAINT_SCHEMA = KCU.CONSTRAINT_SCHEMA),"
ON DELETE ",(SELECT DELETE_RULE FROM REFERENTIAL_CONSTRAINTS WHERE CONSTRAINT_NAME = KCU.CONSTRAINT_NAME AND CONSTRAINT_SCHEMA = KCU.CONSTRAINT_SCHEMA),";") AS add_keys
FROM KEY_COLUMN_USAGE AS KCU
WHERE KCU.CONSTRAINT_SCHEMA = 'DATABASENAME'
AND KCU.POSITION_IN_UNIQUE_CONSTRAINT >= 0
AND KCU.CONSTRAINT_NAME NOT LIKE 'PRIMARY';ALTER TABLE schemaname.tablename DROP FOREIGN KEY key_name;
...ALTER TABLE test DISCARD TABLESPACE;
...cp *.cfg /var/lib/mysql
cp *.ibd /var/lib/mysqlsudo chown -R mysql:mysql /var/lib/mysqlALTER TABLE test IMPORT TABLESPACE;
...ALTER TABLE schmeaname.tablename ADD CONSTRAINT key_name FOREIGN KEY (`column_name`) REFERENCES `foreign_table` (`colum_name`) ON UPDATE NO ACTION ON DELETE NO ACTION;
...USE DATABASE
SELECT * FROM test LIMIT 10;mariadb-dump -u user -p --single-transaction --master-data=2 > fullbackup.sql$ mariadb-backup --backup \
--slave-info --safe-slave-backup \
--target-dir=/var/mariadb/backup/ \
--user=mariadb-backup --password=mypasswordALTER TABLE schemaname.tablename DROP FOREIGN KEY key_name;
...ALTER TABLE test DISCARD TABLESPACE;
...cp *.cfg /var/lib/mysql
cp *.ibd /var/lib/mysqlsudo chown -R mysql:mysql /var/lib/mysqlALTER TABLE test IMPORT TABLESPACE;
...ALTER TABLE schmeaname.tablename ADD CONSTRAINT key_name FOREIGN KEY (`column_name`) REFERENCES `foreign_table` (`colum_name`) ON UPDATE NO ACTION ON DELETE NO ACTION;
...$ mariadb-backup --prepare --export \
--target-dir=/var/mariadb/backup/ \
--user=mariadb-backup --password=mypasswordBACKUP STAGE START;
BACKUP STAGE BLOCK_COMMIT;BACKUP STAGE END;$ sudo systemctl stop mariadbDESCRIBE clients;
+-------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+-------+
| cust_id | int(11) | | PRI | 0 | |
| name | varchar(25) | YES | | NULL | |
| address | varchar(25) | YES | | NULL | |
| city | varchar(25) | YES | | NULL | |
| state | char(2) | YES | | NULL | |
| zip | varchar(10) | YES | | NULL | |
| client_type | varchar(4) | YES | | NULL | |
+-------------+-------------+------+-----+---------+-------+mariadb-dump --user='username' --password='password' --add-locks db1 clients > clients.sqlmariadb --user='username' --password='password' db1 < clients.sqlALTER TABLE clients
ADD COLUMN status CHAR(2);ALTER TABLE clients
ADD COLUMN address2 VARCHAR(25)
AFTER address;...
FIRST;DESCRIBE clients;
+-------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+-------+
| cust_id | int(11) | | PRI | 0 | |
| name | varchar(25) | YES | | NULL | |
| address | varchar(25) | YES | | NULL | |
| address2 | varchar(25) | YES | | NULL | |
| city | varchar(25) | YES | | NULL | |
| state | char(2) | YES | | NULL | |
| zip | varchar(10) | YES | | NULL | |
| client_type | varchar(4) | YES | | NULL | |
| status | char(2) | YES | | NULL | |
+-------------+-------------+------+-----+---------+-------+ALTER TABLE clients
CHANGE status status ENUM('AC','IA');ALTER TABLE clients
CHANGE status active ENUM('AC','IA');ALTER TABLE clients
CHANGE address address1 VARCHAR(40),
MODIFY active ENUM('yes','NO','AC','IA');
UPDATE clients
SET active = 'yes'
WHERE active = 'AC';
UPDATE clients
SET active = 'NO'
WHERE active = 'IA';
ALTER TABLE clients
MODIFY active ENUM('yes','NO');ALTER TABLE clients
DROP client_type;ALTER TABLE clients
ALTER state SET DEFAULT 'LA';ALTER TABLE clients
ALTER state DROP DEFAULT;ALTER TABLE clients
CHANGE cust_id client_id INT
PRIMARY KEY;
ERROR 1068: Multiple primary key definedSHOW INDEX FROM clients\G
*************************** 1. row ***************************
TABLE: clients
Non_unique: 0
Key_name: PRIMARY
Seq_in_index: 1
Column_name: cust_id
Collation: A
Cardinality: 0
Sub_part: NULL
Packed: NULL
Comment:
1 row in set (0.00 sec)ALTER TABLE clients
DROP PRIMARY KEY,
CHANGE cust_id
client_id INT PRIMARY KEY;ALTER TABLE clients
DROP UNIQUE cust_id
CHANGE cust_id
client_id INT UNIQUE;ALTER IGNORE TABLE clients
DROP INDEX cust_id
CHANGE cust_id
client_id INT UNIQUE;RENAME TABLE clients
TO client_addresses;RENAME TABLE client_addresses
TO db2.client_addresses;ALTER TABLE client_addresses
ORDER BY city, name;EXPLAIN PARTITIONS SELECT * FROM orders WHERE id < 15000000;
+------+-------------+--------+------------+-------+---------------+---------+---------+------+------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | Extra |
+------+-------------+--------+------------+-------+---------------+---------+---------+------+------+-------------+
| 1 | SIMPLE | orders | p0,p1 | range | PRIMARY | PRIMARY | 4 | NULL | 2 | Using where |
+------+-------------+--------+------------+-------+---------------+---------+---------+------+------+-------------+SELECT * FROM orders PARTITION (p3) WHERE user_id = 50;
SELECT * FROM orders PARTITION (p2,p3) WHERE user_id >= 40;ALTER TABLE table_name REBUILD PARTITION ALLALTER TABLE table_name REBUILD PARTITION partition_namesALTER TABLE table_name OPTIMIZE PARTITION partition_namesALTER TABLE table_name ANALYZE PARTITION partition_namesALTER TABLE table_name REPAIR PARTITION partition_namesALTER TABLE table_name CHECK PARTITION partition_namesALTER TABLE table_name TRUNCATE PARTITION partition_namesALTER TABLE table_name REORGANIZE PARTITION partition_names INTO (PARTITION partition_definition, ...)ALTER TABLE tbl REORGANIZE PARTITION p_future INTO (PARTITION p_2026 VALUES LESS THAN (2027), PARTITION p_future VALUES LESS THAN MAXVALUE) ERROR 1488 (HY000): Field in list of fields for partition function not found in tableCREATE OR REPLACE TABLE t1 (v1 INT)
PARTITION BY KEY (v1)
PARTITIONS 2;CREATE OR REPLACE TABLE t1 (v1 INT, v2 INT)
PARTITION BY KEY (v1,v2)
PARTITIONS 2;CREATE OR REPLACE TABLE t1 (
id INT NOT NULL PRIMARY KEY,
name VARCHAR(5)
)
PARTITION BY KEY()
PARTITIONS 2;CREATE OR REPLACE TABLE t1 (
id INT NOT NULL UNIQUE KEY,
name VARCHAR(5)
)
PARTITION BY KEY()
PARTITIONS 2;CREATE OR REPLACE TABLE t1 (
id INT NULL UNIQUE KEY,
name VARCHAR(5)
)
PARTITION BY KEY()
PARTITIONS 2;
ERROR 1488 (HY000): Field in list of fields for partition function not found in tableCREATE OR REPLACE TABLE t1 (
id INT NULL UNIQUE KEY,
name VARCHAR(5)
)
PARTITION BY KEY()
PARTITIONS 2;
ERROR 1488 (HY000): Field in list of fields for partition function not found in tableCREATE OR REPLACE TABLE t1 (
id INT NULL UNIQUE KEY,
name VARCHAR(5)
)
PARTITION BY KEY(name)
PARTITIONS 2;CREATE OR REPLACE TABLE t1 (
a VARCHAR(10),
b VARCHAR(10),
c VARCHAR(10),
PRIMARY KEY (a(5), b, c(5))
) PARTITION BY KEY() PARTITIONS 2;
CREATE OR REPLACE TABLE t1 (
a VARCHAR(10),
b VARCHAR(10),
c VARCHAR(10),
PRIMARY KEY (b)
) PARTITION BY KEY() PARTITIONS 2;CREATE OR REPLACE TABLE t1 (
a VARCHAR(10),
b VARCHAR(10),
c VARCHAR(10),
PRIMARY KEY (a(5), b(5), c(5))
) PARTITION BY KEY() PARTITIONS 2;
ERROR 1503 (HY000): A PRIMARY KEY must include all columns in the table's partitioning functionCREATE OR REPLACE TABLE t1 (v1 INT)
PARTITION BY LINEAR KEY (v1)
PARTITIONS 2;Complete Configuring MariaDB for Remote Client Access Guide guide for MariaDB. Complete resource with setup instructions, configuration, usage examples, and.
ERROR 2002 (HY000): Can't connect to MySQL server on 'myhost' (115)./client/mariadb --host=localhost --protocol=tcp --port=3306 testmariadbd --help --verbose#skip-networkingskip-networking=0./sql/mariadbd --print-defaults # Adjust path to mariadbd if necessarymariadb -u root -pSELECT User, Host FROM mysql.user
WHERE Host <> 'localhost' AND Host <> '127.0.0.1' AND Host <> '::1';GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.100.%'
IDENTIFIED BY 'my-very-strong-password' WITH GRANT OPTION;
FLUSH PRIVILEGES;sudo firewall-cmd --add-port=3306/tcp --permanent
sudo firewall-cmd --reloadThis guide explains the SELECT statement in detail, covering how to retrieve, filter, limit, and sort data from your MariaDB database.
CREATE OR REPLACE TABLE books (
isbn CHAR(20) PRIMARY KEY,
title VARCHAR(50),
author_id INT,
publisher_id INT,
year_pub CHAR(4),
description TEXT
);
CREATE OR REPLACE TABLE authors (
author_id INT AUTO_INCREMENT PRIMARY KEY,
name_last VARCHAR(50),
name_first VARCHAR(50),
country VARCHAR(50)
);
INSERT INTO authors (name_last, name_first, country) VALUES
('Kafka', 'Franz', 'Czech Republic'),
('Dostoevsky', 'Fyodor', 'Russia');
INSERT INTO books (title, author_id, isbn, year_pub) VALUES
('The Trial', 1, '0805210407', '1995'),
('The Metamorphosis', 1, '0553213695', '1995'),
('America', 2, '0805210644', '1995'), -- Note: Original data had author_id 2 for 'America', Dostoevsky is author_id 2.
('Brothers Karamozov', 2, '0553212168', ''),
('Crime & Punishment', 2, '0679420290', ''),
('Crime & Punishment', 2, '0553211757', ''),
('Idiot', 2, '0192834118', ''),
('Notes from Underground', 2, '067973452X', '');SELECT * FROM books;+------------+------------------------+-----------+--------------+----------+-------------+
| isbn | title | author_id | publisher_id | year_pub | description |
+------------+------------------------+-----------+--------------+----------+-------------+
| 0192834118 | Idiot | 2 | NULL | | NULL |
| 0553211757 | Crime & Punishment | 2 | NULL | | NULL |
... (other rows)
| 0805210644 | America | 2 | NULL | 1995 | NULL |
+------------+------------------------+-----------+--------------+----------+-------------+
8 rows in set (0.001 sec)SELECT isbn, title, author_id FROM books;+------------+------------------------+-----------+
| isbn | title | author_id |
+------------+------------------------+-----------+
| 0192834118 | Idiot | 2 |
| 0553211757 | Crime & Punishment | 2 |
... (other rows)
+------------+------------------------+-----------+
8 rows in set (0.001 sec)SELECT isbn, title, author_id FROM books LIMIT 5;+------------+--------------------+-----------+
| isbn | title | author_id |
+------------+--------------------+-----------+
| 0192834118 | Idiot | 2 |
| 0553211757 | Crime & Punishment | 2 |
| 0553212168 | Brothers Karamozov | 2 |
| 0553213695 | The Metamorphosis | 1 |
| 0679420290 | Crime & Punishment | 2 |
+------------+--------------------+-----------+
5 rows in set (0.001 sec)SELECT isbn, title, author_id FROM books LIMIT 5, 10; -- Skip 5 rows, show next 10 (or fewer if less remain)+------------+------------------------+-----------+
| isbn | title | author_id |
+------------+------------------------+-----------+
| 067973452X | Notes from Underground | 2 |
| 0805210407 | The Trial | 1 |
| 0805210644 | America | 2 |
+------------+------------------------+-----------+
3 rows in set (0.001 sec)SELECT isbn, title
FROM books
WHERE author_id = 2
LIMIT 5;+------------+------------------------+
| isbn | title |
+------------+------------------------+
| 0192834118 | Idiot |
| 0553211757 | Crime & Punishment |
| 0553212168 | Brothers Karamozov |
| 0679420290 | Crime & Punishment |
| 067973452X | Notes from Underground |
+------------+------------------------+
5 rows in set (0.000 sec)SELECT isbn, title
FROM books
WHERE author_id = 2
ORDER BY title ASC
LIMIT 5;+------------+--------------------+
| isbn | title |
+------------+--------------------+
| 0805210644 | America |
| 0553212168 | Brothers Karamozov |
| 0553211757 | Crime & Punishment |
| 0679420290 | Crime & Punishment |
| 0192834118 | Idiot |
+------------+--------------------+
5 rows in set (0.001 sec)SELECT isbn, title, CONCAT(name_first, ' ', name_last) AS author
FROM books
JOIN authors USING (author_id) -- Assumes 'author_id' column exists in both tables
WHERE name_last = 'Dostoevsky'
ORDER BY title ASC
LIMIT 5;+------------+--------------------+-------------------+
| isbn | title | author |
+------------+--------------------+-------------------+
| 0805210644 | America | Fyodor Dostoevsky |
| 0553212168 | Brothers Karamozov | Fyodor Dostoevsky |
| 0553211757 | Crime & Punishment | Fyodor Dostoevsky |
| 0679420290 | Crime & Punishment | Fyodor Dostoevsky |
| 0192834118 | Idiot | Fyodor Dostoevsky |
+------------+--------------------+-------------------+
5 rows in set (0.00 sec)SELECT isbn, title, CONCAT(name_first, ' ', name_last) AS author
FROM books
JOIN authors USING (author_id)
WHERE name_last LIKE 'Dostoevsk%'
ORDER BY title ASC
LIMIT 5;+------------+--------------------+-------------------+
| isbn | title | author |
+------------+--------------------+-------------------+
| 0805210644 | America | Fyodor Dostoevsky |
| 0553212168 | Brothers Karamozov | Fyodor Dostoevsky |
| 0553211757 | Crime & Punishment | Fyodor Dostoevsky |
| 0679420290 | Crime & Punishment | Fyodor Dostoevsky |
| 0192834118 | Idiot | Fyodor Dostoevsky |
+------------+--------------------+-------------------+
5 rows in set (0.001 sec)SELECT DISTINCT title
FROM books
JOIN authors USING (author_id)
WHERE name_last = 'Dostoevsky'
ORDER BY title;+------------------------+
| title |
+------------------------+
| America |
| Brothers Karamozov |
| Crime & Punishment |
| Idiot |
| Notes from Underground |
+------------------------+SELECT DISTINCT HIGH_PRIORITY title
FROM books
JOIN authors USING (author_id)
WHERE name_last = 'Dostoevsky'
ORDER BY title;SELECT SQL_CALC_FOUND_ROWS isbn, title
FROM books
JOIN authors USING (author_id)
WHERE name_last = 'Dostoevsky'
ORDER BY title -- Order before limit to ensure consistent FOUND_ROWS() for a given query logic
LIMIT 5;A beginner-friendly primer on using the mariadb command-line client to log in, create databases, and execute basic SQL commands.
mariadb -u user_name -p -h ip_address db_nameMariaDB [test]>CREATE DATABASE IF NOT EXISTS test;
USE test;
CREATE TABLE IF NOT EXISTS books (
BookID INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
Title VARCHAR(100) NOT NULL,
SeriesID INT,
AuthorID INT
);
CREATE TABLE IF NOT EXISTS authors (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT
-- You would typically add more columns like name, etc.
);
CREATE TABLE IF NOT EXISTS series (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT
-- You would typically add more columns like series_name, etc.
);
INSERT INTO books (Title, SeriesID, AuthorID) VALUES
('The Fellowship of the Ring', 1, 1),
('The Two Towers', 1, 1),
('The Return of the King', 1, 1),
('The Sum of All Men', 2, 2),
('Brotherhood of the Wolf', 2, 2),
('Wizardborn', 2, 2),
('The Hobbbit', 0, 1); -- Note: "Hobbbit" is intentionally misspelled for a later exampleSHOW TABLES;+----------------+
| Tables_in_test |
+----------------+
| authors |
| books |
| series |
+----------------+
3 rows in set (0.00 sec)DESCRIBE books;+----------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+----------------+
| BookID | int(11) | NO | PRI | NULL | auto_increment |
| Title | varchar(100) | NO | | NULL | |
| SeriesID | int(11) | YES | | NULL | |
| AuthorID | int(11) | YES | | NULL | |
+----------+--------------+------+-----+---------+----------------+SELECT * FROM books;+--------+----------------------------+----------+----------+
| BookID | Title | SeriesID | AuthorID |
+--------+----------------------------+----------+----------+
| 1 | The Fellowship of the Ring | 1 | 1 |
| 2 | The Two Towers | 1 | 1 |
| 3 | The Return of the King | 1 | 1 |
| 4 | The Sum of All Men | 2 | 2 |
| 5 | Brotherhood of the Wolf | 2 | 2 |
| 6 | Wizardborn | 2 | 2 |
| 7 | The Hobbbit | 0 | 1 |
+--------+----------------------------+----------+----------+
7 rows in set (0.00 sec)INSERT INTO books (Title, SeriesID, AuthorID)
VALUES ("Lair of Bones", 2, 2);Query OK, 1 row affected (0.00 sec)UPDATE books
SET Title = "The Hobbit"
WHERE BookID = 7;Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0Configure MariaDB to accept remote connections by adjusting the bind-address directive and granting appropriate user privileges.
(/my/maria-10.11) ./client/mariadb --host=myhost --protocol=tcp --port=3306 test
ERROR 2002 (HY000): Can't connect to MySQL server on 'myhost' (115)
(/my/maria-10.11) telnet myhost 3306
Trying 192.168.0.11...
telnet: connect to address 192.168.0.11: Connection refused(my/maria-10.11) ./client/mariadb --host=localhost --protocol=tcp --port=3306 test
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with
Welcome to the MariaDB monitor. Commands end with ; or \g.
...* /etc/my.cnf (*nix/BSD)
* $MYSQL_HOME/my.cnf (*nix/BSD) *Most Notably /etc/mysql/my.cnf
* SYSCONFDIR/my.cnf (*nix/BSD)
* DATADIR\my.ini (Windows)shell> mariadbd --help --verbose
mariadbd Ver 10.11.5-MariaDB for linux-systemd on x86_64 (MariaDB Server)
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Starts the MariaDB database server.
Usage: ./mariadbd [OPTIONS]
Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf[mysqld]
...
skip-networking
...
bind-address = <some ip-address>
...[mysqld]
...
#skip-networking
...
#bind-address = <some ip-address>
...[mysqld]
skip-networking=0
skip-bind-addressshell> ./sql/mariadbd --print-defaults
./sql/mariadbd would have been started with the following arguments:
--bind-address=127.0.0.1 --innodb_file_per_table=ON --server-id=1 --skip-bind-address ...Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 36
Server version: 5.5.28-MariaDB-mariadb1~lucid mariadb.org binary distribution
Copyright (c) 2000, 2012, Oracle, Monty Program Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]>SELECT User, Host FROM mysql.user WHERE Host <> 'localhost';
+--------+-----------+
| User | Host |
+--------+-----------+
| daniel | % |
| root | 127.0.0.1 |
| root | ::1 |
| root | gandalf |
+--------+-----------+
4 rows in set (0.00 sec)GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.100.%'
IDENTIFIED BY 'my-new-password' WITH GRANT OPTION;firewall-cmd --add-port=3306/tcp
firewall-cmd --permanent --add-port=3306/tcpComplete Importing Data into MariaDB guide for MariaDB. Complete reference documentation for implementation, configuration, and usage for production use.
LOAD DATA INFILE '/tmp/prospects.txt'
INTO TABLE prospect_contact
FIELDS TERMINATED BY '|';LOAD DATA INFILE '/tmp/prospects.txt'
INTO TABLE prospect_contact
FIELDS TERMINATED BY '|'
LINES STARTING BY '"'
TERMINATED BY '"\r\n';...
LINES STARTING BY '\''
...LOAD DATA INFILE '/tmp/prospects.txt'
REPLACE INTO TABLE prospect_contact
FIELDS TERMINATED BY '|'
LINES STARTING BY '"'
TERMINATED BY '"\n';LOAD DATA LOW_PRIORITY INFILE '/tmp/prospects.txt'
......
TERMINATED BY 0x0d0a;...
IGNORE 1 LINES;LOAD DATA LOW_PRIORITY INFILE '/tmp/prospects.txt'
REPLACE INTO TABLE prospect_contact
FIELDS TERMINATED BY '"'
ENCLOSED BY '"' ESCAPED BY '#'
LINES STARTING BY '"'
TERMINATED BY '"\n'
IGNORE 1 LINES;LOAD DATA LOW_PRIORITY INFILE '/tmp/prospects.txt'
REPLACE INTO TABLE sales_dept.prospect_contact
FIELDS TERMINATED BY 0x09
ENCLOSED BY '"' ESCAPED BY '#'
TERMINATED BY 0x0d0a
IGNORE 1 LINES
(name_last, name_first, telephone);mariadb-import --user='marie_dyer' --password='angelle1207' \
--fields-terminated-by=0x09 --lines-terminated-by=0x0d0a \
--replace --low-priority --fields-enclosed-by='"' \
--fields-escaped-by='#' --ignore-lines='1' --verbose \
--columns='name_last, name_first, telephone' \
sales_dept '/tmp/prospect_contact.txt'mariadb-dump --user='root' --password='geronimo' sales_dept prospect_contact > /tmp/prospects.sqlmariadb --user='marie_dyer' --password='angelle12107' sales_dept < '/tmp/prospects.sql'mariadb-dump -u marie_dyer -p --no-create-info sales_dept prospect_contact > /tmp/prospects.sqlThis page details MariaDB Enterprise Backup, an enhanced version of mariadb-backup with enterprise-specific optimizations and support.
CREATE USER 'mariadb-backup'@'localhost'
IDENTIFIED BY 'mbu_passwd';
GRANT RELOAD, PROCESS, LOCK TABLES, BINLOG MONITOR
ON *.*
TO 'mariadb-backup'@'localhost';CREATE USER 'mariadb-backup'@'localhost'
IDENTIFIED BY 'mbu_passwd';
GRANT RELOAD, PROCESS, LOCK TABLES, REPLICATION CLIENT
ON *.*
TO 'mariadb-backup'@'localhost';sudo mariadb-backup --backup \
--target-dir=/data/backups/full \
--user=mariadb-backup \
--password=mbu_passwdsudo mariadb-backup --prepare \
--use-memory=34359738368 \
--target-dir=/data/backups/fullmariadb-backup --copy-back --target-dir=/data/backups/fullchown -R mysql:mysql /var/lib/mysqlsudo systemctl start mariadbmariadb-backup --backup \
--incremental-basedir=/data/backups/full \
--target-dir=/data/backups/inc1 \
--user=mariadb-backup \
--password=mbu_passwdmariadb-backup --prepare --target-dir=/data/backups/fullmariadb-backup --prepare \
--target-dir=/data/backups/full \
--incremental-dir=/data/backups/inc1mariadb-backup --copy-back --target-dir=/data/backups/fullchown -R mysql:mysql /var/lib/mysqlmariadb-backup --backup \
--target-dir=/data/backups/part \
--user=mariadb-backup \
--password=mbu_passwd \
--database-exclude=testmariadb-backup --backup \
--incremental-basedir=/data/backups/part \
--target-dir=/data/backups/part_inc1 \
--user=mariadb-backup \
--password=mbu_passwd \
--database-exclude=testmariadb-backup --prepare --export --target-dir=/data/backups/partmariadb-backup --prepare --export \
--target-dir=/data/backups/part \
--incremental-dir=/data/backups/part_inc1CREATE TABLE test.address_book (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255),
email VARCHAR(255));ALTER TABLE test.address_book DISCARD TABLESPACE;# cp /data/backups/part_inc1/test/address_book.* /var/lib/mysql/test# chown mysql:mysql /var/lib/mysql/test/address_book.*ALTER TABLE test.address_book IMPORT TABLESPACE;CREATE TABLE test.students (
id INT PRIMARY KEY AUTO_INCREMENT
name VARCHAR(255),
email VARCHAR(255),
graduating_year YEAR)
PARTITION BY RANGE (graduating_year) (
PARTITION p9 VALUES LESS THAN 2019
PARTITION p1 VALUES LESS THAN MAXVALUE
);CREATE TABLE test.students_work AS
SELECT * FROM test.students WHERE NULL;ALTER TABLE test.students_work DISCARD TABLESPACE;# cp /data/backups/part_inc1/test/students.ibd /var/lib/mysql/test/students_work.ibd
# cp /data/backups/part_inc1/test/students.cfg /var/lib/mysql/test/students_work.cfg# chown mysql:mysql /var/lib/mysql/test/students_work.*ALTER TABLE test.students_work IMPORT TABLESPACE;ALTER TABLE test.students EXCHANGE PARTITION p0 WITH TABLE test.students_work;DROP TABLE test.students_work;DROP TABLE IF EXISTS db1.t1;CREATE TABLE db1.t1(f1 CHAR(10)) ENGINE=INNODB;ALTER TABLE db1.t1 DISCARD TABLESPACE;$ sudo cp /data/backups/part/db1/t1.* /var/lib/mysql/db1$ sudo rm /var/lib/mysql/db1/t1.cfg$ sudo chown mysql:mysql /var/lib/mysql/db1/t1.*ALTER TABLE db1.t1 IMPORT TABLESPACE;SELECT * FROM db1.t1;+--------+
| f1 |
+--------+
| ABC123 |
+--------+ALTER TABLE db1.t1 FORCE, ADD FULLTEXT INDEX f_idx(f1);SHOW CREATE TABLE db1.t1\G*************************** 1. row ***************************
Table: t1
Create Table: CREATE TABLE `t1` (
`f1` char(10) DEFAULT NULL,
FULLTEXT KEY `f_idx` (`f1`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ciComplete MariaDB backup and recovery guide. Complete resource for backup methods, mariadb-backup usage, scheduling, and restoration for production use.
mariadb-backupsudo yum install MariaDB-backupsudo apt-get install mariadb-backupsudo zypper install MariaDB-backup
mariadb-backup <options>CREATE USER 'mariadb-backup'@'localhost' IDENTIFIED BY 'mypassword';
GRANT RELOAD, PROCESS, LOCK TABLES, BINLOG MONITOR ON *.* TO 'mariadb-backup'@'localhost';CREATE USER 'mariadb-backup'@'localhost' IDENTIFIED BY 'mypassword';
GRANT RELOAD, PROCESS, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'mariadb-backup'@'localhost';GRANT SELECT, INSERT, CREATE, ALTER ON mysql.mariadb_backup_history TO 'mariadb-backup'@'localhost';GRANT SELECT, INSERT, CREATE, ALTER ON PERCONA_SCHEMA.xtrabackup_history TO 'mariadb-backup'@'localhost';GRANT DROP, ALTER, RENAME ON PERCONA_SCHEMA.xtrabackup_history TO 'mariadb-backup'@'localhost';
GRANT CREATE ON PERCONA_SCHEMA TO 'mariadb-backup'@'localhost';RENAME TABLE PERCONA_SCHEMA.xtrabackup_history TO mysql.mariadb_backup_history;
ALTER TABLE mysql.mariadb_backup_history ENGINE=InnoDB;mariadb-backup --backup \
--target-dir=/var/mariadb/backup/ \
--user=mariadb-backup --password=mypassword[mariadb-backup]
user=mariadb-backup
password=mypasswordmariadb-backup with Data-at-Rest Encryptionmariadb-backup for Galera SSTsmariadb-backupmariadb-backup2019-02-12 09:48:38 7ffff7fdb820 InnoDB: Operating system error number 23 in a file operation.
InnoDB: Error number 23 means 'Too many open files in system'.
InnoDB: Some operating system error numbers are described at
InnoDB: http://dev.mysql.com/doc/refman/5.6/en/operating-system-error-codes.html
InnoDB: Error: could not open single-table tablespace file ./db1/tab1.ibd
InnoDB: We do not continue the crash recovery, because the table may become
InnoDB: corrupt if we cannot apply the log records in the InnoDB log to it.
InnoDB: To fix the problem and start mysqld:
InnoDB: 1) If there is a permission problem in the file and mysqld cannot
InnoDB: open the file, you should modify the permissions.
InnoDB: 2) If the table is not needed, or you can restore it from a backup,
InnoDB: then you can remove the .ibd file, and InnoDB will do a normal
InnoDB: crash recovery and ignore that table.
InnoDB: 3) If the file system or the disk is broken, and you cannot remove
InnoDB: the .ibd file, you can set innodb_force_recovery > 0 in my.cnf
InnoDB: and force InnoDB to continue crash recovery here.[mariadb-backup]
open_files_limit=65535mysql soft nofile 65535
mysql hard nofile 65535ulimit -Sn
65535
ulimit -Hn
65535Reference for mariadb-backup (mariabackup) command-line options. Covers --backup, --prepare, --copy-back, --move-back, streaming, and incremental backups.
mariadb-backup Options (mariabackup)mariadb-backup --backup --target-dir=/backups/full \
--user=mariadb-backup --password=...mariadb-backup --prepare --target-dir=/backups/fullmariadb-backup --copy-back --target-dir=/backups/fullmariadb-backup --backup --target-dir=/backups/inc1 \
--incremental-basedir=/backups/full--apply-logmariadb-backup --innobackupex --apply-log--apply-log-only--backupmariadb-backup --backup
--target-dir /path/to/backup \
--user user_name --password user_passwd--binlog-info--binlog-info[=OFF | ON | LOCKLESS | AUTO]mariadb-backup --binlog-info --backup--close-filesmariadb-backup --close-files --prepare--compress--compress[=compression_algorithm]mariadb-backup --compress --backup--compress-chunk-size--compress-chunk-size=#mariadb-backup --backup --compress \
--compress-threads=12 --compress-chunk-size=5M--compress-threads--compress-threads=#mariadb-backup --compress --compress-threads=12 --backup--copy-backmariadb-backup --copy-back --force-non-empty-directories--core-filemariadb-backup --core-file --backup--databases--databases="database[.table][ database[.table] ...]"mariadb-backup --backup \
--databases="example.table1 example.table2"--databases-exclude--databases-exclude="database[.table][ database[.table] ...]"mariadb-backup --backup \
--databases="example" \
--databases-exclude="example.table1 example.table2"--databases-file--databases-file="/path/to/database-file"database[.table]cat main-backupexample1
example2.table1
example2.table2mariadb-backup --backup --databases-file=main-backup-h, --datadir--datadir=PATHmariadb-backup --backup -h /var/lib64/mysql--debug-sleep-before-unlock--decompressmariadb-backup --compress --backupmariadb-backup --decompress--debug-sync--defaults-extra-file--defaults-extra-file=/path/to/configmariadb-backup --backup \
--defaults-file-extra=addition-config.cnf \
--defaults-file=config.cnf--defaults-file--defaults-file=/path/to/configmariadb-backup --backup \
--defaults-file=config.cnf--defaults-group--defaults-group="name"[mariadb-backup]
compress_threads = 12
compress_chunk_size = 64Kmariadb-backup --compress --backup--encrypted-backup--exportmariadb-backup --prepare --export--extra-lsndir--extra-lsndir=PATHmariadb-backup --extra-lsndir=extras/ --backup--force-non-empty-directoriesmariadb-backup --force-non-empty-directories --copy-back--ftwrl-wait-query-type--ftwrl-wait-query-type=[ALL | UPDATE | SELECT]mariadb-backup --backup \
--ftwrl-wait-query-type=UPDATE--ftwrl-wait-threshold--ftwrl-wait-threshold=#mariadb-backup --backup \
--ftwrl-wait-timeout=90 \
--ftwrl-wait-threshold=30--ftwrl-wait-timeout--ftwrl-wait-timeout=#mariadb-backup --backup \
--ftwrl-wait-query-type=UPDATE \
--ftwrl-wait-timeout=5Unable to obtain lock. Please try again later.FATAL ERROR: failed to execute query BACKUP STAGE START:
Lock wait timeout exceeded; try restarting transaction[00] 2022-02-08 15:43:25 Unable to obtain lock. Please try again later.
[00] 2022-02-08 15:43:25 Error on BACKUP STAGE START query execution
mariabackup: Stopping log copying thread.--galera-infomariadb-backup --backup --galera-info--history--history[=name]mariadb-backup --backup --history=backup_all-H, --host--host=name_or_ip-addressmariadb-backup --backup \
--host="192.168.0.33"--include--incrementalmariadb-backup --innobackupex --incrementalmariadb-backup --innobackupex --backup --incremental \
--incremental-basedir=/data/backups \
--target-dir=/data/backups--incremental-basedir--incremental-basedir=PATHmariadb-backup --backup \
--incremental-basedir=/data/backups \
--target-dir=/data/backups--incremental-dir--increment-dir=PATHmariadb-backup --prepare \
--increment-dir=backups/--incremental-force-scanmariadb-backup --backup \
--incremental-basedir=/path/to/target \
--incremental-force-scan--incremental-history-name--incremental-history-name=namemariadb-backup --backup \
--incremental-history-name=morning_backup--incremental-history-uuid--incremental-history-uuid=namemariadb-backup --backup \
--incremental-history-uuid=main-backup012345678--incremental-lsn--incremental-lsn=name--innobackupexmariadb-backup --innobackupex--innodb--innodb-adaptive-hash-indexmariadb-backup --backup \
--innodb-adaptive-hash-index--innodb-autoextend-increment--innodb-autoextend-increment=36mariadb-backup --backup \
--innodb-autoextend-increment=35--innodb-buffer-pool-filename--innodb-buffer-pool-size--innodb-buffer-pool-size=124Mmariadb-backup --backup \
--innodb-buffer-pool-size=124M--innodb-checksum-algorithm--innodb-data-file-path--innodb-data-file-path=/path/to/filemariadb-backup --backup \
--innodb-data-file-path=ibdata1:13M:autoextend \
--innodb-data-home-dir=/var/dbs/mysql/data--innodb-data-home-dir--innodb-data-home-dir=PATHmariadb-backup --backup \
--innodb-data-file-path=ibdata1:13M:autoextend \
--innodb-data-home-dir=/var/dbs/mysql/data--innodb-doublewritemariadb-backup --backup \
--innodb-doublewrite--innodb-encrypt-log--innodb-file-io-threads--innodb-file-io-threads=#mariadb-backup --backup \
--innodb-file-io-threads=5--innodb-file-per-table--innodb-flush-method--innodb-flush-method=fdatasync
| O_DSYNC
| O_DIRECT
| O_DIRECT_NO_FSYNC
| ALL_O_DIRECTmariadb-backup --backup \
--innodb-flush-method==_DIRECT_NO_FSYNC--innodb-io-capacity--innodb-io-capacity=#mariadb-backup --backup \
--innodb-io-capacity=200--innodb-log-buffer-size--innodb-log-checksumsmariadb-backup --backup \
--innodb-log-checksums--innodb-log-checkpoint-nowmariadb-backup --backup \
--innodb-log-checkpoint-now--innodb-log-file-mmap--innodb-log-files-in-group--innodb-log-group-home-dir--innodb-log-group-home-dir=PATHmariadb-backup --backup \
--innodb-log-group-home-dir=/path/to/logs--innodb-max-dirty-pages-pct--innodb-max-dirty-pages-pct=#mariadb-backup --backup \
--innodb-max-dirty-pages-pct=80--innodb-open-files--innodb-open-files=#mariadb-backup --backup \
--innodb-open-files=10--innodb-page-size--innodb-page-size=#mariadb-backup --backup \
--innodb-page-size=16k--innodb-read-io-threads--innodb-read-io-threads=#mariadb-backup --backup \
--innodb-read-io-threads=4--innodb-undo-directory--innodb-undo-directory=PATHmariadb-backup --backup \
--innodb-undo-directory=/path/to/innodb_undo--innodb-undo-tablespaces--innodb-undo-tablespaces=#mariadb-backup --backup \
--innodb-undo-tablespaces=10--innodb-use-native-aiomariadb-backup --backup \
--innodb-use-native-aio--innodb-write-io-threads--innodb-write-io-threads=#mariadb-backup --backup \
--innodb-write-io-threads=4--kill-long-queries-timeout--kill-long-queries-timeout=#mariadb-backup --backup \
--kill-long-queries-timeout=10--kill-long-query-type--kill-long-query-type=ALL | UPDATE | SELECTmariadb-backup --backup \
--kill-long-query-type=UPDATE--lock-ddl-per-table--log--log-bin--log-bin[=name]--log-copy-interval--log-copy-interval=#mariadb-backup --backup \
--log-copy-interval=50--log-innodb-page-corruption--move-backmariadb-backup --move-back \
--datadir=/var/mysql--mysqld--no-backup-locksmariadb-backup --backup --no-backup-locks--no-lockmariadb-backup --backup --no-lock--no-timestamp--no-version-checkmariadb-backup --backup --no-version-check--open-files-limit--open-files-limit=#mariadb-backup --backup \
--open-files-limit=--parallel--parallel=#-p, --password--password=passwdmariadb-backup --backup \
--user=root \
--password=root_password--plugin-dir--plugin-dir=PATHmariadb-backup --backup \
--plugin-dir=/var/mysql/lib/plugin--plugin-load-P, --port--port=#mariadb-backup --backup \
--host=192.168.11.1 \
--port=3306--preparemariadb-backup --prepare--print-defaultsmariadb-backup --print-defaults--print-parammariadb-backup --print-param--rollback-xa--rsyncmariadb-backup --backup --rsync--safe-slave-backupmariadb-backup --backup \
--safe-slave-backup \
--safe-slave-backup-timeout=500--safe-slave-backup-timeout--safe-slave-backup-timeout=#mariadb-backup --backup \
--safe-slave-backup \
--safe-slave-backup-timeout=500--secure-authmariadb-backup --backup --secure-auth--skip-innodb-adaptive-hash-indexmariadb-backup --backup \
--skip-innodb-adaptive-hash-index--skip-innodb-doublewritemariadb-backup --backup \
--skip-innodb-doublewrite--skip-innodb-log-checksums--skip-secure-authmariadb-backup --backup --skip-secure-auth--slave-infomariadb-backup --slave-info-S, --socket--socket=namemariadb-backup --backup \
--socket=/var/mysql/mysql.sock--ssl--ssl-ca--ssl-ca=/etc/my.cnf.d/certificates/ca.pemmariadb-backup --backup \
--ssl-cert=/etc/my.cnf.d/certificates/client-cert.pem \
--ssl-key=/etc/my.cnf.d/certificates/client-key.pem \
--ssl-ca=/etc/my.cnf.d/certificates/ca.pem--ssl-capath--ssl-capath=/etc/my.cnf.d/certificates/ca/mariadb-backup --backup \
--ssl-cert=/etc/my.cnf.d/certificates/client-cert.pem \
--ssl-key=/etc/my.cnf.d/certificates/client-key.pem \
--ssl-ca=/etc/my.cnf.d/certificates/ca.pem \
--ssl-capath=/etc/my.cnf.d/certificates/ca/--ssl-cert--ssl-cert=/etc/my.cnf.d/certificates/client-cert.pemmariadb-backup --backup \
--ssl-cert=/etc/my.cnf.d/certificates/client-cert.pem \
--ssl-key=/etc/my.cnf.d/certificates/client-key.pem \
--ssl-ca=/etc/my.cnf.d/certificates/ca.pem--ssl-cipher--ssl-cipher=namemariadb-backup --backup \
--ssl-cert=/etc/my.cnf.d/certificates/client-cert.pem \
--ssl-key=/etc/my.cnf.d/certificates/client-key.pem \
--ssl-ca=/etc/my.cnf.d/certificates/ca.pem \
--ssl-cipher=TLSv1.2--ssl-crl--ssl-crl=/etc/my.cnf.d/certificates/crl.pemmariadb-backup --backup \
--ssl-cert=/etc/my.cnf.d/certificates/client-cert.pem \
--ssl-key=/etc/my.cnf.d/certificates/client-key.pem \
--ssl-ca=/etc/my.cnf.d/certificates/ca.pem \
--ssl-crl=/etc/my.cnf.d/certificates/crl.pem--ssl-crlpath--ssl-crlpath=/etc/my.cnf.d/certificates/crl/mariadb-backup --backup \
--ssl-cert=/etc/my.cnf.d/certificates/client-cert.pem \
--ssl-key=/etc/my.cnf.d/certificates/client-key.pem \
--ssl-ca=/etc/my.cnf.d/certificates/ca.pem \
--ssl-crlpath=/etc/my.cnf.d/certificates/crl/--ssl-key--ssl-key=/etc/my.cnf.d/certificates/client-key.pemmariadb-backup --backup \
--ssl-cert=/etc/my.cnf.d/certificates/client-cert.pem \
--ssl-key=/etc/my.cnf.d/certificates/client-key.pem \
--ssl-ca=/etc/my.cnf.d/certificates/ca.pem--ssl-verify-server-certmariadb-backup --backup \
--ssl-cert=/etc/my.cnf.d/certificates/client-cert.pem \
--ssl-key=/etc/my.cnf.d/certificates/client-key.pem \
--ssl-ca=/etc/my.cnf.d/certificates/ca.pem \
--ssl-verify-server-cert--stream--stream=xbstreammariadb-backup --stream=xbstream > backup.xbmbstream -x < backup.xb--tables--tables=REGEXmariadb-backup --backup \
--databases=example \
--tables=nodes_* \
--tables-exclude=nodes_tmpmariadb-backup --backup \
--databases=example \
--tables=^nodes. \
--tables-exclude=^nodes_tmp.mariadb-backup --backup \
--tables=test1[.].*,test2[.].* \
--tables-exclude=^test2[.]exclude_table
--target-dir=/path/to/backups/--tables-exclude--tables-exclude=REGEX--tables-file--tables-file=/path/to/filemariadb-backup --backup \
--databases=example \
--tables-file=/etc/mysql/backup-file--target-dir--target-dir=/path/to/targetmariadb-backup --backup \
--target-dir=/data/backups--throttle--throttle=#--tls-version--tls-version="TLSv1.2,TLSv1.3"mariadb-backup --backup \
--ssl-cert=/etc/my.cnf.d/certificates/client-cert.pem \
--ssl-key=/etc/my.cnf.d/certificates/client-key.pem \
--ssl-ca=/etc/my.cnf.d/certificates/ca.pem \
--tls-version="TLSv1.2,TLSv1.3"-t, --tmpdir--tmpdir=/path/tmp[;/path/tmp...]mariadb-backup --backup \
--tmpdir=/data/tmp;/tmp--use-memory--use-memory=124Mmariadb-backup --prepare \
--use-memory=124M--user--user=name
-u namemariadb-backup --backup \
--user=root \
--password=root_passwd--verbosemariadb-backup --verbose--versionmariadb-backup --versionInitialize a replication slave using a backup. This guide shows how to use mariadb-backup to provision a new replica from a master server.
$ mariadb-backup --backup \
--target-dir=/var/mariadb/backup/ \
--user=mariadb-backup --password=mypassword$ mariadb-backup --backup \
--slave-info --safe-slave-backup \
--target-dir=/var/mariadb/backup/ \
--user=mariadb-backup --password=mypassword$ mariadb-backup --prepare \
--target-dir=/var/mariadb/backup/$ rsync -avP /var/mariadb/backup dbserver2:/var/mariadb/backup$ mariadb-backup --copy-back \
--target-dir=/var/mariadb/backup/$ chown -R mysql:mysql /var/lib/mysql/CREATE USER 'repl'@'dbserver2' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'dbserver2';mariadb-bin.000096 568 0-1-2$ cat xtrabackup_binlog_info
mariadb-bin.000096 568 0-1-2SET GLOBAL gtid_slave_pos = "0-1-2";
CHANGE MASTER TO
MASTER_HOST="dbserver1",
MASTER_PORT=3306,
MASTER_USER="repl",
MASTER_PASSWORD="password",
MASTER_USE_GTID=slave_pos;
START SLAVE;CHANGE MASTER TO
MASTER_HOST="dbserver1",
MASTER_PORT=3306,
MASTER_USER="repl",
MASTER_PASSWORD="password",
MASTER_LOG_FILE='mariadb-bin.000096',
MASTER_LOG_POS=568;
START SLAVE;SHOW SLAVE STATUS\GThis guide explains various methods for copying tables between MariaDB databases and servers, including using FLUSH TABLES FOR EXPORT and mysqldump.
FLUSH TABLES db_name.table_name FOR EXPORT
# Copy the relevant files associated with the table
UNLOCK TABLES;CREATE TABLE new_table ... ENGINE=ARIA TRANSACTIONAL=0;
ALTER TABLE new_table DISABLE_KEYS;
# Fill the table with data:
INSERT INTO new_table SELECT * ...
FLUSH TABLE new_table WITH READ LOCK;
# Copy table data to some external location, like /tmp with something
# like cp /my/data/test/new_table.* /tmp/
UNLOCK TABLES;> ls -l /tmp/new_table.*
-rw-rw---- 1 mysql my 42396148 Sep 21 17:58 /tmp/new_table.MAD
-rw-rw---- 1 mysql my 8192 Sep 21 17:58 /tmp/new_table.MAI
-rw-rw---- 1 mysql my 1039 Sep 21 17:58 /tmp/new_table.frm
> aria_pack /tmp/new_table
Compressing /tmp/new_table.MAD: (922666 records)
- Calculating statistics
- Compressing file
46.07%
> aria_chk -rq --ignore-control-file --sort_buffer_size=1G /tmp/new_table
Recreating table '/tmp/new_table'
- check record delete-chain
- recovering (with sort) Aria-table '/tmp/new_table'
Data records: 922666
- Fixing index 1
State updated
> ls -l /tmp/new_table.*
-rw-rw---- 1 mysql my 26271608 Sep 21 17:58 /tmp/new_table.MAD
-rw-rw---- 1 mysql my 10207232 Sep 21 17:58 /tmp/new_table.MAI
-rw-rw---- 1 mysql my 1039 Sep 21 17:58 /tmp/new_table.frmComplete DROP TABLE syntax: TEMPORARY, IF EXISTS, WAIT/NOWAIT, RESTRICT/CASCADE options, metadata locks, atomic DROP, and replication behavior.
DROP [TEMPORARY] TABLE [IF EXISTS] [/*COMMENT TO SAVE*/]
tbl_name [, tbl_name] ...
[WAIT n|NOWAIT]
[RESTRICT | CASCADE]DROP TABLE `#mysql50##sql-...`;SELECT CONCAT('DROP TABLE IF EXISTS `', TABLE_SCHEMA, '`.`', TABLE_NAME, '`;')
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'mydb';DROP TABLE Employees, Customers;Understand the different types of indexes in MariaDB, such as Primary Keys and Unique Indexes, and how to use them to optimize query performance.
CREATE TABLE `Employees` (
`ID` TINYINT(3) UNSIGNED NOT NULL AUTO_INCREMENT,
`First_Name` VARCHAR(25) NOT NULL,
`Last_Name` VARCHAR(25) NOT NULL,
`Position` VARCHAR(25) NOT NULL,
`Home_Address` VARCHAR(50) NOT NULL,
`Home_Phone` VARCHAR(12) NOT NULL,
PRIMARY KEY (`ID`)
);ALTER TABLE Employees ADD PRIMARY KEY(ID);SELECT t.TABLE_SCHEMA, t.TABLE_NAME
FROM information_schema.TABLES AS t
LEFT JOIN information_schema.KEY_COLUMN_USAGE AS c
ON t.TABLE_SCHEMA = c.CONSTRAINT_SCHEMA
AND t.TABLE_NAME = c.TABLE_NAME
AND c.CONSTRAINT_NAME = 'PRIMARY'
WHERE t.TABLE_SCHEMA != 'information_schema'
AND t.TABLE_SCHEMA != 'performance_schema'
AND t.TABLE_SCHEMA != 'mysql'
AND c.CONSTRAINT_NAME IS NULL;CREATE TABLE `Employees` (
`ID` TINYINT(3) UNSIGNED NOT NULL,
`First_Name` VARCHAR(25) NOT NULL,
`Last_Name` VARCHAR(25) NOT NULL,
`Position` VARCHAR(25) NOT NULL,
`Home_Address` VARCHAR(50) NOT NULL,
`Home_Phone` VARCHAR(12) NOT NULL,
`Employee_Code` VARCHAR(25) NOT NULL,
PRIMARY KEY (`ID`),
UNIQUE KEY (`Employee_Code`)
);ALTER TABLE Employees ADD UNIQUE `EmpCode`(`Employee_Code`);CREATE UNIQUE INDEX HomePhone ON Employees(Home_Phone);CREATE TABLE t1 (a INT NOT NULL, b INT, UNIQUE (a,b));
INSERT INTO t1 VALUES (1,1), (2,2);
SELECT * FROM t1;
+---+------+
| a | b |
+---+------+
| 1 | 1 |
| 2 | 2 |
+---+------+INSERT INTO t1 VALUES (2,1);
SELECT * FROM t1;
+---+------+
| a | b |
+---+------+
| 1 | 1 |
| 2 | 1 |
| 2 | 2 |
+---+------+INSERT INTO t1 VALUES (3,NULL), (3, NULL);
SELECT * FROM t1;
+---+------+
| a | b |
+---+------+
| 1 | 1 |
| 2 | 1 |
| 2 | 2 |
| 3 | NULL |
| 3 | NULL |
+---+------+SELECT (3, NULL) = (3, NULL);
+---------------------- +
| (3, NULL) = (3, NULL) |
+---------------------- +
| 0 |
+---------------------- +CREATE TABLE Table_1 (
user_name VARCHAR(10),
status ENUM('Active', 'ON-Hold', 'Deleted'),
del CHAR(0) AS (IF(status IN ('Active', 'ON-Hold'),'', NULL)) persistent,
UNIQUE(user_name,del)
)CREATE TABLE t1 (a INT PRIMARY KEY,
b BLOB,
c1 VARCHAR(1000),
c2 VARCHAR(1000),
c3 VARCHAR(1000),
c4 VARCHAR(1000),
c5 VARCHAR(1000),
c6 VARCHAR(1000),
c7 VARCHAR(1000),
c8 VARCHAR(1000),
c9 VARCHAR(1000),
UNIQUE KEY `b` (b),
UNIQUE KEY `all_c` (c1,c2,c3,c4,c6,c7,c8,c9)) ENGINE=myisam;SHOW CREATE TABLE t1\G
*************************** 1. row ***************************
TABLE: t1
CREATE TABLE: CREATE TABLE `t1` (
`a` INT(11) NOT NULL,
`b` BLOB DEFAULT NULL,
`c1` VARCHAR(1000) DEFAULT NULL,
`c2` VARCHAR(1000) DEFAULT NULL,
`c3` VARCHAR(1000) DEFAULT NULL,
`c4` VARCHAR(1000) DEFAULT NULL,
`c5` VARCHAR(1000) DEFAULT NULL,
`c6` VARCHAR(1000) DEFAULT NULL,
`c7` VARCHAR(1000) DEFAULT NULL,
`c8` VARCHAR(1000) DEFAULT NULL,
`c9` VARCHAR(1000) DEFAULT NULL,
PRIMARY KEY (`a`),
UNIQUE KEY `b` (`b`) USING HASH,
UNIQUE KEY `all_c` (`c1`,`c2`,`c3`,`c4`,`c6`,`c7`,`c8`,`c9`) USING HASH
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ciCREATE TABLE t2 (a INT NOT NULL, b INT, INDEX (a,b));
INSERT INTO t2 VALUES (1,1), (2,2), (2,2);
SELECT * FROM t2;
+---+------+
| a | b |
+---+------+
| 1 | 1 |
| 2 | 2 |
| 2 | 2 |
+---+------+Complete Partitioning Overview guide for MariaDB. Complete reference documentation for implementation, configuration, and usage for production use.
SHOW PLUGINS;
...
| Aria | ACTIVE | STORAGE ENGINE | NULL | GPL |
| FEEDBACK | DISABLED | INFORMATION SCHEMA | NULL | GPL |
| partition | ACTIVE | STORAGE ENGINE | NULL | GPL |
+-------------------------------+----------+--------------------+---------+---------+| partition | DISABLED | STORAGE ENGINE | NULL | GPL |
+-------------------------------+----------+--------------------+---------+---------+--skip-partition
--disable-partition
--partition=OFFADD PARTITION [IF NOT EXISTS] (partition_definition)CREATE OR REPLACE TABLE t1 (
dt DATETIME NOT NULL
)
ENGINE = InnoDB
PARTITION BY RANGE (YEAR(dt))
(
PARTITION p0 VALUES LESS THAN (2013),
PARTITION p1 VALUES LESS THAN (2014),
PARTITION p2 VALUES LESS THAN (2015),
PARTITION p3 VALUES LESS THAN (2016)
);
ALTER TABLE t1 ADD PARTITION (
PARTITION p4 VALUES LESS THAN (2017),
PARTITION p5 VALUES LESS THAN (2018)
);ALTER TABLE t1 ADD PARTITION (
PARTITION p0a VALUES LESS THAN (2012)
);
ERROR 1493 (HY000): VALUES LESS THAN value must be strictly increasing for each partitionCOALESCE PARTITION numberCREATE OR REPLACE TABLE t1 (v1 INT)
PARTITION BY KEY (v1)
PARTITIONS 5;ALTER TABLE t1 COALESCE PARTITION 2;CONVERT PARTITION partition_name TO TABLE tbl_name
CONVERT TABLE normal_table TO partition_definitionCREATE OR REPLACE TABLE t1 (
dt DATETIME NOT NULL
)
ENGINE = InnoDB
PARTITION BY RANGE (YEAR(dt))
(
PARTITION p0 VALUES LESS THAN (2013),
PARTITION p1 VALUES LESS THAN (2014),
PARTITION p2 VALUES LESS THAN (2015),
PARTITION p3 VALUES LESS THAN (2016)
);
INSERT INTO t1 VALUES ('2013-11-11'),('2014-11-11'),('2015-11-11');
SELECT * FROM t1;
+--------------+
| dt |
+--------------+
| 2013-11-11 00:00:00 |
| 2014-11-11 00:00:00 |
| 2015-11-11 00:00:00 |
+---------------------+
ALTER TABLE t1 CONVERT PARTITION p3 TO TABLE t2;
SELECT * FROM t1;
+--------------+
| dt |
+--------------+
| 2013-11-11 00:00:00 |
| 2014-11-11 00:00:00 |
+---------------------+
SELECT * FROM t2;
+--------------+
| dt |
+--------------+
| 2015-11-11 00:00:00 |
+---------------------+
SHOW CREATE TABLE t1\G
*************************** 1. row ***************************
TABLE: t1
CREATE TABLE: CREATE TABLE `t1` (
`dt` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
PARTITION BY RANGE (year(`dt`))
(PARTITION `p0` VALUES LESS THAN (2013) ENGINE = InnoDB,
PARTITION `p1` VALUES LESS THAN (2014) ENGINE = InnoDB,
PARTITION `p2` VALUES LESS THAN (2015) ENGINE = InnoDB)
SHOW CREATE TABLE t2\G
*************************** 1. row ***************************
TABLE: t2
CREATE TABLE: CREATE TABLE `t2` (
`dt` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ciALTER TABLE t1 CONVERT TABLE t2 TO PARTITION p3 VALUES LESS THAN (2016);
SELECT * FROM t1;
+--------------+
| dt |
+--------------+
| 2013-11-11 00:00:00 |
| 2014-11-11 00:00:00 |
| 2015-11-11 00:00:00 |
+---------------------+
3 rows in set (0.001 sec)
SELECT * FROM t2;
ERROR 1146 (42S02): Table 'test.t2' doesn't exist
SHOW CREATE TABLE t1\G
*************************** 1. row ***************************
TABLE: t1
CREATE TABLE: CREATE TABLE `t1` (
`dt` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
PARTITION BY RANGE (year(`dt`))
(PARTITION `p0` VALUES LESS THAN (2013) ENGINE = InnoDB,
PARTITION `p1` VALUES LESS THAN (2014) ENGINE = InnoDB,
PARTITION `p2` VALUES LESS THAN (2015) ENGINE = InnoDB,
PARTITION `p3` VALUES LESS THAN (2016) ENGINE = InnoDB)CONVERT TABLE normal_table TO partition_definition [{WITH | WITHOUT} VALIDATION]CREATE OR REPLACE TABLE t1 (
dt DATETIME NOT NULL
)
ENGINE = InnoDB
PARTITION BY RANGE (YEAR(dt))
(
PARTITION p0 VALUES LESS THAN (2013),
PARTITION p1 VALUES LESS THAN (2014),
PARTITION p2 VALUES LESS THAN (2015),
PARTITION p3 VALUES LESS THAN (2016)
);
INSERT INTO t1 VALUES ('2013-11-11'),('2014-11-11'),('2015-11-11');
SELECT * FROM t1;
+--------------+
| dt |
+--------------+
| 2013-11-11 00:00:00 |
| 2014-11-11 00:00:00 |
| 2015-11-11 00:00:00 |
+---------------------+
CREATE OR REPLACE TABLE t2 LIKE t1;
ALTER TABLE t2 REMOVE PARTITIONING;
ALTER TABLE t1 EXCHANGE PARTITION p3 WITH TABLE t2;
ALTER TABLE t1 DROP PARTITION p3;
SELECT * FROM t1;
+--------------+
| dt |
+--------------+
| 2013-11-11 00:00:00 |
| 2014-11-11 00:00:00 |
+---------------------+
SELECT * FROM t2;
+--------------+
| dt |
+--------------+
| 2015-11-11 00:00:00 |
+---------------------+
SHOW CREATE TABLE t1\G
*************************** 1. row ***************************
TABLE: t1
CREATE TABLE: CREATE TABLE `t1` (
`dt` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
PARTITION BY RANGE (year(`dt`))
(PARTITION `p0` VALUES LESS THAN (2013) ENGINE = InnoDB,
PARTITION `p1` VALUES LESS THAN (2014) ENGINE = InnoDB,
PARTITION `p2` VALUES LESS THAN (2015) ENGINE = InnoDB)
SHOW CREATE TABLE t2\G
*************************** 1. row ***************************
TABLE: t2
CREATE TABLE: CREATE TABLE `t2` (
`dt` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ciALTER TABLE t1 ADD PARTITION (PARTITION p3 VALUES LESS THAN (2016));
ALTER TABLE t1 EXCHANGE PARTITION p3 WITH TABLE t2;
DROP TABLE t2;
SELECT * FROM t1;
+--------------+
| dt |
+--------------+
| 2013-11-11 00:00:00 |
| 2014-11-11 00:00:00 |
| 2015-11-11 00:00:00 |
+---------------------+
SHOW CREATE TABLE t1\G
*************************** 1. row ***************************
TABLE: t1
CREATE TABLE: CREATE TABLE `t1` (
`dt` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
PARTITION BY RANGE (year(`dt`))
(PARTITION `p0` VALUES LESS THAN (2013) ENGINE = InnoDB,
PARTITION `p1` VALUES LESS THAN (2014) ENGINE = InnoDB,
PARTITION `p2` VALUES LESS THAN (2015) ENGINE = InnoDB,
PARTITION `p3` VALUES LESS THAN (2016) ENGINE = InnoDB)DROP PARTITION [IF EXISTS] partition_namesCREATE OR REPLACE TABLE t1 (
dt DATETIME NOT NULL
)
ENGINE = InnoDB
PARTITION BY RANGE (YEAR(dt))
(
PARTITION p0 VALUES LESS THAN (2013),
PARTITION p1 VALUES LESS THAN (2014),
PARTITION p2 VALUES LESS THAN (2015),
PARTITION p3 VALUES LESS THAN (2016)
);
INSERT INTO t1 VALUES ('2012-11-15');
SELECT * FROM t1;
+--------------+
| dt |
+--------------+
| 2012-11-15 00:00:00 |
+---------------------+
ALTER TABLE t1 DROP PARTITION p0;
SELECT * FROM t1;
Empty set (0.002 sec)EXCHANGE PARTITION partition_name WITH TABLE tbl_name [{WITH | WITHOUT} VALIDATION]EXCHANGE PARTITION partition_name WITH TABLE tbl_nameCREATE OR REPLACE TABLE t1 (
dt DATETIME NOT NULL
)
ENGINE = InnoDB
PARTITION BY RANGE (YEAR(dt))
(
PARTITION p0 VALUES LESS THAN (2013),
PARTITION p1 VALUES LESS THAN (2014)
);
CREATE OR REPLACE TABLE t2 (
dt DATETIME NOT NULL
) ENGINE = InnoDB;
INSERT INTO t1 VALUES ('2012-01-01'),('2013-01-01');
INSERT INTO t2 VALUES ('2013-02-02');
SELECT * FROM t1;
+--------------+
| dt |
+--------------+
| 2012-01-01 00:00:00 |
| 2013-01-01 00:00:00 |
+---------------------+
SELECT * FROM t2;
+--------------+
| dt |
+--------------+
| 2013-02-02 00:00:00 |
+---------------------+
ALTER TABLE t1 EXCHANGE PARTITION p1 WITH TABLE t2;
SELECT * FROM t1;
+--------------+
| dt |
+--------------+
| 2012-01-01 00:00:00 |
| 2013-02-02 00:00:00 |
+---------------------+
SELECT * FROM t2;
+--------------+
| dt |
+--------------+
| 2013-01-01 00:00:00 |
+---------------------+CREATE OR REPLACE TABLE t1 (
dt DATETIME NOT NULL
)
ENGINE = InnoDB
PARTITION BY RANGE (YEAR(dt))
(
PARTITION p0 VALUES LESS THAN (2013),
PARTITION p1 VALUES LESS THAN (2014)
);
CREATE OR REPLACE TABLE t2 (
dt DATETIME NOT NULL
) ENGINE = InnoDB;
INSERT INTO t1 VALUES ('2012-02-02'),('2013-03-03');
INSERT INTO t2 VALUES ('2015-05-05');
ALTER TABLE t1 EXCHANGE PARTITION p1 WITH TABLE t2;ERROR 1526 (HY000): Table has no partition for value 0ALTER TABLE t1 EXCHANGE PARTITION p1 WITH TABLE t2 WITHOUT VALIDATION;Query OK, 0 rows affected (0.048 sec)REMOVE PARTITIONINGALTER TABLE t1 REMOVE PARTITIONING;REORGANIZE PARTITION [partition_names INTO (partition_definitions)]CREATE OR REPLACE TABLE t1 (
dt DATETIME NOT NULL
)
ENGINE = InnoDB
PARTITION BY RANGE (YEAR(dt))
(
PARTITION p0 VALUES LESS THAN (2013),
PARTITION p1 VALUES LESS THAN (2014),
PARTITION p2 VALUES LESS THAN (2015),
PARTITION p3 VALUES LESS THAN (2016)
);
ALTER TABLE t1 REORGANIZE PARTITION p0 INTO (
PARTITION p0a VALUES LESS THAN (2012),
PARTITION p0b VALUES LESS THAN (2013)
);CREATE OR REPLACE TABLE t1 (
dt DATETIME NOT NULL
)
ENGINE = InnoDB
PARTITION BY RANGE (YEAR(dt))
(
PARTITION p0 VALUES LESS THAN (2013),
PARTITION p1 VALUES LESS THAN (2014),
PARTITION p2 VALUES LESS THAN (2015),
PARTITION p3 VALUES LESS THAN (2016),
PARTITION p4 VALUES LESS THAN MAXVALUE
);
ALTER TABLE t1 REORGANIZE PARTITION p4 INTO (
PARTITION p4 VALUES LESS THAN (2017),
PARTITION p5 VALUES LESS THAN MAXVALUE
);CREATE OR REPLACE TABLE t1 (
dt DATETIME NOT NULL
)
ENGINE = InnoDB
PARTITION BY RANGE (YEAR(dt))
(
PARTITION p0 VALUES LESS THAN (2013),
PARTITION p1 VALUES LESS THAN (2014),
PARTITION p2 VALUES LESS THAN (2015),
PARTITION p3 VALUES LESS THAN (2016)
);
ALTER TABLE t1 REORGANIZE PARTITION p2,p3 INTO (
PARTITION p2 VALUES LESS THAN (2016)
);CREATE OR REPLACE TABLE t1 (
dt DATETIME NOT NULL
)
ENGINE = InnoDB
PARTITION BY RANGE (YEAR(dt))
(
PARTITION p0 VALUES LESS THAN (2013),
PARTITION p1 VALUES LESS THAN (2014),
PARTITION p2 VALUES LESS THAN (2015),
PARTITION p3 VALUES LESS THAN (2016)
);
ALTER TABLE t1 REORGANIZE PARTITION p3 INTO (
PARTITION p3 VALUES LESS THAN (2017)
);CREATE OR REPLACE TABLE t1 (
dt DATETIME NOT NULL
)
ENGINE = InnoDB
PARTITION BY RANGE (YEAR(dt))
(
PARTITION p0 VALUES LESS THAN (2013),
PARTITION p1 VALUES LESS THAN (2014),
PARTITION p2 VALUES LESS THAN (2015),
PARTITION p3 VALUES LESS THAN (2016)
);
ALTER TABLE t1 REORGANIZE PARTITION p3 INTO (
PARTITION p3_new VALUES LESS THAN (2016)
);TRUNCATE PARTITION partition_namesCREATE OR REPLACE TABLE t1 (
dt DATETIME NOT NULL
)
ENGINE = InnoDB
PARTITION BY RANGE (YEAR(dt))
(
PARTITION p0 VALUES LESS THAN (2013),
PARTITION p1 VALUES LESS THAN (2014),
PARTITION p2 VALUES LESS THAN (2015),
PARTITION p3 VALUES LESS THAN (2016)
);
INSERT INTO t1 VALUES ('2012-11-01'),('2013-11-02'),('2014-11-03'),('2015-11-04');
SELECT * FROM t1;
+--------------+
| dt |
+--------------+
| 2012-11-01 00:00:00 |
| 2013-11-02 00:00:00 |
| 2014-11-03 00:00:00 |
| 2015-11-04 00:00:00 |
+---------------------+
ALTER TABLE t1 TRUNCATE PARTITION p0,p2;
SELECT * FROM t1;
+--------------+
| dt |
+--------------+
| 2013-11-02 00:00:00 |
| 2015-11-04 00:00:00 |
+---------------------+ALTER TABLE t1 ANALYZE PARTITION p0,p1,p3;
+---------+---------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+---------+---------+----------+----------+
| test.t1 | analyze | status | OK |
+---------+---------+----------+----------+CHECK PARTITION {ALL | PARTITION [,partition2 ...]}ALTER TABLE t1 CHECK PARTITION p1,p3;
+---------+-------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+---------+-------+----------+----------+
| test.t1 | check | status | OK |
+---------+-------+----------+----------+REPAIR PARTITION {ALL | partition [,partition2 ...]} [QUICK] [EXTENDED]ALTER TABLE t1 REPAIR PARTITION p0,p3;
+---------+--------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+---------+--------+----------+----------+
| test.t1 | repair | status | OK |
+---------+--------+----------+----------+OPTIMIZE PARTITION {ALL | PARTITION [,partition2 ...]}ALTER TABLE t1 OPTIMIZE PARTITION p0,p3;
+---------+----------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+---------+----------+----------+----------+
| test.t1 | optimize | status | OK |
+---------+----------+----------+----------+Discover these variants that allow partitioning based on multiple columns and non-integer types, offering greater flexibility than standard RANGE/LIST.
This page outlines constraints when using partitioning, such as the maximum number of partitions and restrictions on foreign keys and query cache usage.
Learn how MariaDB stores partitioned tables on the filesystem, typically creating separate .ibd files for each partition when using InnoDB.
Understand how to retrieve metadata about partitions using the INFORMATION_SCHEMA.PARTITIONS table to monitor row counts and storage usage.
orders.frm
orders.par
orders#P#p0.ibd
orders#P#p1.ibd
orders#P#p2.ibd
orders#P#p3.ibd[mysqld]
...
#skip-networking
#bind-address = 127.0.0.1
...[mysqld]
bind-address = 0.0.0.0+------------+------------------------+
| isbn | title |
+------------+------------------------+
| 0805210644 | America |
| 0553212168 | Brothers Karamozov |
| 0553211757 | Crime & Punishment |
| 0679420290 | Crime & Punishment |
| 0192834118 | Idiot |
+------------+------------------------+
5 rows in set (0.001 sec)SELECT FOUND_ROWS();+--------------+
| FOUND_ROWS() |
+--------------+
| 6 |
+--------------+
1 row in set (0.000 sec)PARTITION BY RANGE COLUMNS (col1, col2, ...)
(
PARTITION partition_name VALUES LESS THAN (value1, value2, ...),
[ PARTITION partition_name VALUES LESS THAN (value1, value2, ...), ... ]
)PARTITION BY LIST COLUMNS (partitioning_expression)
(
PARTITION partition_name VALUES IN (value1, value2, ...),
[ PARTITION partition_name VALUES IN (value1, value2, ...), ... ]
[ PARTITION partititon_name DEFAULT ]
)CREATE OR REPLACE TABLE t1 (
date1 DATE NOT NULL,
date2 DATE NOT NULL
)
ENGINE = InnoDB
PARTITION BY RANGE COLUMNS (date1,date2) (
PARTITION p0 VALUES LESS THAN ('2013-01-01', '1994-12-01'),
PARTITION p1 VALUES LESS THAN ('2014-01-01', '1995-12-01'),
PARTITION p2 VALUES LESS THAN ('2015-01-01', '1996-12-01')
);CREATE OR REPLACE TABLE t1 (
num TINYINT(1) NOT NULL
)
ENGINE = InnoDB
PARTITION BY LIST COLUMNS (num) (
PARTITION p0 VALUES IN (0,1),
PARTITION p1 VALUES IN (2,3),
PARTITION p2 DEFAULT
);orders.frm
orders.par
orders#P#p0.MYD
orders#P#p0.MYI
orders#P#p1.MYD
orders#P#p1.MYI
orders#P#p2.MYD
orders#P#p2.MYI
orders#P#p3.MYD
orders#P#p3.MYIRANGE partitioning, the syntax is the following:PARTITION BY RANGE (partitioning_expression)
(
PARTITION partition_name VALUES LESS THAN (value),
[ PARTITION partition_name VALUES LESS THAN (value), ... ]
[ PARTITION partition_name VALUES LESS THAN MAXVALUE ]
)CREATE TABLE log
(
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
dt DATETIME NOT NULL,
user INT UNSIGNED,
PRIMARY KEY (id, dt)
)
ENGINE = InnoDB
PARTITION BY RANGE (YEAR(dt))
(
PARTITION p0 VALUES LESS THAN (2013),
PARTITION p1 VALUES LESS THAN (2014),
PARTITION p2 VALUES LESS THAN (2015),
PARTITION p3 VALUES LESS THAN (2016)
);CREATE TABLE log2
(
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
ts TIMESTAMP NOT NULL,
user INT UNSIGNED,
PRIMARY KEY (id, ts)
)
ENGINE = InnoDB
PARTITION BY RANGE (UNIX_TIMESTAMP(ts))
(
PARTITION p0 VALUES LESS THAN (UNIX_TIMESTAMP('2014-08-01 00:00:00')),
PARTITION p1 VALUES LESS THAN (UNIX_TIMESTAMP('2014-11-01 00:00:00')),
PARTITION p2 VALUES LESS THAN (UNIX_TIMESTAMP('2015-01-01 00:00:00')),
PARTITION p3 VALUES LESS THAN (UNIX_TIMESTAMP('2015-02-01 00:00:00'))
);ALTER TABLE log DROP PARTITION p0;INSERT INTO log(id,dt) VALUES
(1, '2016-01-01 01:01:01'),
(2, '2015-01-01 01:01:01');
ERROR 1526 (HY000): Table has no partition for value 2016INSERT IGNORE INTO log(id,dt) VALUES
(1, '2016-01-01 01:01:01'),
(2, '2015-01-01 01:01:01');
SELECT * FROM log;
+----+---------------------+------+
| id | timestamp | user |
+----+---------------------+------+
| 2 | 2015-01-01 01:01:01 | NULL |
+----+---------------------+------+CREATE TABLE log
(
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
dt DATETIME NOT NULL,
user INT UNSIGNED,
PRIMARY KEY (id, dt)
)
ENGINE = InnoDB
PARTITION BY RANGE (YEAR(dt))
(
PARTITION p0 VALUES LESS THAN (2013),
PARTITION p1 VALUES LESS THAN (2014),
PARTITION p2 VALUES LESS THAN (2015),
PARTITION p3 VALUES LESS THAN (2016),
PARTITION p4 VALUES LESS THAN MAXVALUE
);CREATE
[OR REPLACE]
[DEFINER = { user | CURRENT_USER | role | CURRENT_ROLE }]
PROCEDURE [IF NOT EXISTS] sp_name ([proc_parameter[,...]])
[characteristic ...] routine_body
proc_parameter:
[ IN | OUT | INOUT ] param_name type
type:
Any valid MariaDB data type
characteristic:
LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT 'string'
routine_body:
Valid SQL procedure statementCREATE
[OR REPLACE]
[DEFINER = { user | CURRENT_USER | role | CURRENT_ROLE }]
PROCEDURE [IF NOT EXISTS] sp_name ([proc_parameter[,...]])
[characteristic ...] routine_body
proc_parameter:
[ OUT | INOUT | IN OUT] param_name type |
[ IN ] param_name type [DEFAULT value or expression]
type:
Any valid MariaDB data type
characteristic:
LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT 'string'
routine_body:
Valid SQL procedure statementDROP PROCEDURE IF EXISTS name;
CREATE PROCEDURE name ...;DELIMITER //
CREATE PROCEDURE simpleproc (OUT param1 INT)
BEGIN
SELECT COUNT(*) INTO param1 FROM t;
END;
//
DELIMITER ;
CALL simpleproc(@a);
SELECT @a;
+------+
| @a |
+------+
| 1 |
+------+DELIMITER //
CREATE PROCEDURE simpleproc2 (
OUT param1 CHAR(10) CHARACTER SET 'utf8' COLLATE 'utf8_bin'
)
BEGIN
SELECT CONCAT('a'),f1 INTO param1 FROM t;
END;
//
DELIMITER ;DELIMITER //
CREATE PROCEDURE simpleproc2 (
OUT param1 CHAR(10) CHARACTER SET 'utf8' COLLATE 'utf8_bin'
)
BEGIN
SELECT CONCAT('a'),f1 INTO param1 FROM t;
END;
//
ERROR 1304 (42000): PROCEDURE simpleproc2 already exists
DELIMITER ;
DELIMITER //
CREATE OR REPLACE PROCEDURE simpleproc2 (
OUT param1 CHAR(10) CHARACTER SET 'utf8' COLLATE 'utf8_bin'
)
BEGIN
SELECT CONCAT('a'),f1 INTO param1 FROM t;
END;
//
ERROR 1304 (42000): PROCEDURE simpleproc2 already exists
DELIMITER ;
Query OK, 0 rows affected (0.03 sec)ALTER PROCEDURE statement. However, you cannot change the parameters or body of a stored procedure using this statement. To make such changes, you must drop and re-create the procedure using ALTER PROCEDURE proc_name [characteristic ...]
characteristic:
{ CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT 'string'ALTER PROCEDURE simpleproc SQL SECURITY INVOKER;--history[=name]mariadb-backup --backup --history=backup_allLearn how to effectively use MariaDB Server. This section covers SQL statements, built-in functions, client utilities, and best practices for daily database operations.
author_id, publisher_id: INT, for storing numeric IDs.mariadb -u root -p -h localhostmariadb -pCREATE DATABASE bookstore;
USE bookstore;CREATE TABLE books (
isbn CHAR(20) PRIMARY KEY,
title VARCHAR(50),
author_id INT,
publisher_id INT,
year_pub CHAR(4),
description TEXT
);DESCRIBE books;+--------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+-------+
| isbn | char(20) | NO | PRI | NULL | |
| title | varchar(50) | YES | | NULL | |
| author_id | int(11) | YES | | NULL | |
| publisher_id | int(11) | YES | | NULL | |
| year_pub | char(4) | YES | | NULL | |
| description | text | YES | | NULL | |
+--------------+-------------+------+-----+---------+-------+CREATE TABLE authors (
author_id INT AUTO_INCREMENT PRIMARY KEY,
name_last VARCHAR(50),
name_first VARCHAR(50),
country VARCHAR(50)
);INSERT INTO authors (name_last, name_first, country)
VALUES('Kafka', 'Franz', 'Czech Republic');INSERT INTO books (title, author_id, isbn, year_pub)
VALUES('The Castle', '1', '0805211063', '1998');INSERT INTO books (title, author_id, isbn, year_pub)
VALUES('The Trial', '1', '0805210407', '1995'),
('The Metamorphosis', '1', '0553213695', '1995'),
('America', '1', '0805210644', '1995');SELECT title FROM books;SELECT title FROM books LIMIT 5;SELECT title, name_last
FROM books
JOIN authors USING (author_id);SELECT title AS 'Kafka Books'
FROM books
JOIN authors USING (author_id)
WHERE name_last = 'Kafka';+-------------------+
| Kafka Books |
+-------------------+
| The Castle |
| The Trial |
| The Metamorphosis |
| America |
+-------------------+UPDATE books
SET title = 'Amerika'
WHERE isbn = '0805210644';DELETE FROM books
WHERE author_id = '2034'; -- Assuming '2034' is the author_id to be deletedThis guide details how to connect to a MariaDB server using the command-line client, covering options for host, user, password, and protocol.
This section offers advice on writing and maintaining applications that use databases, covering schema design, code practices, and testing.
Secure and compress backup streams. Learn to pipe backup output to tools like GPG and GZIP for encryption and storage efficiency.
mariadb-backup --user=root --backup --stream=xbstream | openssl enc -aes-256-cbc -k mypass > backup.xb.encComplete Restoring Data from Dump Files Guide guide for MariaDB. Complete resource with setup instructions, configuration, usage examples, and best practices.
Get an overview of MariaDB Backup. This section introduces the hot physical backup tool, explaining its capabilities for efficient and consistent backups of your MariaDB Server.
-ppassword: Specifies password as the password.PARTITION BY LINEAR HASH (partitioning_expression)
[PARTITIONS(number_of_partitions)]mariadbmariadb -h 166.78.144.191 -u username -ppassword database_nameMariaDB> USE prod_v2;
MariaDB> CREATE VIEW `orders_t` AS
SELECT `order_id`, `order_date` FROM `prod_v1`.`orders_t`;MariaDB> USE prod_v2;
MariaDB> CREATE TABLE `orders_t`(
`order_id` INTEGER NOT NULL PRIMARY KEY,
`order_date` DATETIME NOT NULL,
`customer_id` INTEGER NOT NULL DEFAULT 0);
MariaDB> INSERT INTO `orders_t` SELECT `order_id`, `order_date`
FROM `prod_v1`.`orders_t`;
MariaDB> USE prod_v1;
MariaDB> RENAME TABLE `orders_t` TO `orders_t_v1`;
MariaDB> CREATE VIEW `orders_t` AS
SELECT `order_id`, `order_date` FROM `prod_v2`.`orders_t`;MariaDB> USE prod_v1
MariaDB> ALTER TABLE `orders_t`
ADD `customer_id` INTEGER NOT NULL DEFAULT 0 INVISIBLE;
MariaDB> SELECT * FROM `orders_t`;
+----------+---------------------+
| order_id | order_date |
+----------+---------------------+
| 1 | 2024-05-17 18:01:01 |
| 2 | 2025-12-12 18:44:08 |
+----------+---------------------+
2 rows in set (0.004 sec)
MariaDB> INSERT INTO `orders_t`
(`order_id`, `order_date`, `customer_id`) VALUES(3, NOW(), 2);openssl enc -d -aes-256-cbc -k mypass -in backup.xb.enc | mbstream -xmariadb-backup --user=root --backup --stream=xbstream | gzip > backupstream.gzgunzip -c backupstream.gz | mbstream -xmariadb-backup --user=root --backup --stream=xbstream | gzip | openssl enc -aes-256-cbc -k mypass > backup.xb.gz.encopenssl enc -d -aes-256-cbc -k mypass -in backup.xb.gz.enc |gzip -d| mbstream -xmariadb-backup --user=root --backup --stream=xbstream | 7z a -si backup.xb.7z7z e backup.xb.7z -so |mbstream -xmariadb-backup --user=root --backup --stream=xbstream | zstd - -o backup.xb.zst -f -1zstd -d backup.xbstream.zst -c | mbstream -xmariadb-backup --user=root --backup --stream=xbstream | gpg -c --passphrase SECRET --batch --yes -o backup.xb.gpggpg --decrypt --passphrase SECRET --batch --yes backup.xb.gpg | mbstream -xMOD(partitioning_expression, number_of_partitions)CREATE OR REPLACE TABLE t1 (c1 INT, c2 DATETIME)
PARTITION BY HASH(TO_DAYS(c2))
PARTITIONS 5;INSERT INTO t1 VALUES (1,'2023-11-15');
SELECT PARTITION_NAME,TABLE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS
WHERE TABLE_SCHEMA='test' AND TABLE_NAME='t1';
+----------------+------------+
| PARTITION_NAME | TABLE_ROWS |
+----------------+------------+
| p0 | 0 |
| p1 | 0 |
| p2 | 0 |
| p3 | 0 |
| p4 | 1 |
+----------------+------------+CREATE OR REPLACE TABLE t1 (c1 INT, c2 DATETIME)
PARTITION BY LINEAR HASH(TO_DAYS(c2))
PARTITIONS 5;PARTITION BY LIST (partitioning_expression)
(
PARTITION partition_name VALUES IN (value_list),
[ PARTITION partition_name VALUES IN (value_list), ... ]
[ PARTITION partition_name DEFAULT ]
)CREATE OR REPLACE TABLE t1 (
num TINYINT(1) NOT NULL
)
ENGINE = InnoDB
PARTITION BY LIST (num) (
PARTITION p0 VALUES IN (0,1),
PARTITION p1 VALUES IN (2,3),
PARTITION p2 DEFAULT
);mariadb --user your_username --password < /path/to/your/backupfile.sqlLearn about best practices for database schema design, including naming conventions, choosing appropriate data types, and using views to abstract complexity.
Learn how to design a robust backup strategy tailored to your business needs, balancing recovery time objectives and data retention policies.
Deep dive into backup mechanics. Understand how the tool handles redo logs, locking, and file copying to ensure consistent backups.
Explore how to use replication as part of your backup strategy, allowing you to offload backup tasks to a replica server to reduce load on the primary.








TRUNCATETABLEmariadb --user your_username --password your_database_name < /path/to/your/backupfile.sql-- Connect to MariaDB as an administrative user (e.g., root)
CREATE USER 'admin_restore_temp'@'localhost' IDENTIFIED BY 'its_very_secure_pwd';
-- Grant general SELECT on the database (might be needed if dump file structure requires it)
-- Or, if not needed, ensure the user can at least USE the database.
GRANT SELECT ON your_database_name.* TO 'admin_restore_temp'@'localhost';
-- Grant full privileges ONLY on the table to be restored
GRANT ALL PRIVILEGES ON your_database_name.table_to_restore TO 'admin_restore_temp'@'localhost';
FLUSH PRIVILEGES;mariadb --user admin_restore_temp --password --force your_database_name < /path/to/your/fulldumpfile.sqlDROP USER 'admin_restore_temp'@'localhost';CREATE TABLE `orders_t`(`order_id` BIGINT NOT NULL PRIMARY KEY,
`order_date` DATETIME NOT NULL,
`customer_id` BIGINT NOT NULL,
FOREIGN KEY(`customer_id`) REFERENCES `customer_t`(`customer_id`));
CREATE VIEW orders_v_1
AS
SELECT o.`order_id`, o.`order_date` FROM `orders_t` o;CREATE DATABASE mydb;
USE mydb;
CREATE TABLE mytable ( id INT PRIMARY KEY, name VARCHAR(20) );
INSERT INTO mytable VALUES ( 1, 'Will' );
INSERT INTO mytable VALUES ( 2, 'Marry' );
INSERT INTO mytable VALUES ( 3, 'Dean' );
SELECT id, name FROM mytable WHERE id = 1;
UPDATE mytable SET name = 'Willy' WHERE id = 1;
SELECT id, name FROM mytable;
DELETE FROM mytable WHERE id = 1;
SELECT id, name FROM mytable;
DROP DATABASE mydb;
SELECT COUNT(1) FROM mytable; gives the NUMBER OF records IN the TABLEmariadb-backup --backup \
--target-dir=/data/backups/full \
--user=mariadb-backup \
--password=mbu_passwd \
--ssl-ca=/etc/my.cnf.d/certs/ca.pem \
--ssl-cert=/etc/my.cnf.d/certs/client-cert.pem \
--ssl-key=/etc/my.cnf.d/certs/client-key.pemBEGIN
FOR EACH affected TABLE
SELECT 1 FROM <TABLE> LIMIT 0INSERT INTO `orders_t` VALUES(1, ‘2025-06-01 12:00:00’);INSERT INTO `orders_t`(`order_id`, `order_date`)
VALUES(1, ‘2025-06-01 12:00:00’);SELECT YEAR(`order_date`) AS `order_year` FROM `orders_t`;CREATE TABLE `order`(`order_id` INTEGER NOT NULL PRIMARY KEY);SELECT order_id AS `order` FROM orders_t;MariaDB> SELECT `order_date` FROM `orders_t`;
+---------------------+
| order_date |
+---------------------+
| 2024-05-17 18:01:01 |
| 2025-12-12 18:44:08 |
| 2025-12-12 18:44:17 |
| 2025-09-09 14:57:47 |
+---------------------+
4 rows in set (0.000 sec)
MariaDB> ALTER TABLE `orders_t` ADD KEY(`order_date`);
Query OK, 0 rows affected (0.034 sec)
Records: 0 Duplicates: 0 Warnings: 0
MariaDB> SELECT `order_date` FROM `orders_t`;
+---------------------+
| order_date |
+---------------------+
| 2024-05-17 18:01:01 |
| 2025-09-09 14:57:47 |
| 2025-12-12 18:44:08 |
| 2025-12-12 18:44:17 |
+---------------------+
4 rows in set (0.003 sec)CREATE USER 'backup_replica'@'replica_ip_or_hostname' IDENTIFIED BY 'strong_password';
GRANT REPLICATION SLAVE ON *.* TO 'backup_replica'@'replica_ip_or_hostname';SHOW GLOBAL VARIABLES LIKE 'gtid_current_pos';SET GLOBAL gtid_slave_pos='<gtid_value_from_primary>';CHANGE MASTER TO
MASTER_HOST='primary_domain_or_ip',
MASTER_PORT=3306,
MASTER_USER='backup_replica',
MASTER_PASSWORD='strong_password',
MASTER_SSL=1,
MASTER_USE_GTID=slave_pos;START REPLICA;SHOW REPLICA STATUS \GComplete mariadb-backup incremental guide: --backup/--prepare syntax, LSN xtrabackup_checkpoints, --incremental-basedir, and --copy-back/--move-back restore.
Back up specific databases or tables. This guide explains how to filter your backup to include only the data you need.
Complete Connecting to MariaDB Server guide for MariaDB. Complete reference documentation for implementation, configuration, and usage for production use.
$ mariadb-backup --backup \
--target-dir=/var/mariadb/backup/ \
--user=mariadb-backup --password=mypasswordbackup_type = full-backuped
from_lsn = 0
to_lsn = 1635102
last_lsn = 1635102
recover_binlog_info = 0$ mariadb-backup --backup \
--target-dir=/var/mariadb/inc1/ \
--incremental-basedir=/var/mariadb/backup/ \
--user=mariadb-backup --password=mypasswordbackup_type = incremental
from_lsn = 1635102
to_lsn = 1635114
last_lsn = 1635114
recover_binlog_info = 0$ mariadb-backup --backup \
--target-dir=/var/mariadb/inc2/ \
--incremental-basedir=/var/mariadb/inc1/ \
--user=mariadb-backup --password=mypasswordmariadb-backup --backup --target-dir=/full \
--history=full_backup_1mariadb-backup --backup --target-dir=/inc1 \
--incremental-history-name=full_backup_1 \
--history=inc_backup_1# initial full backup
$ mariadb-backup --backup --stream=mbstream \
--user=mariadb-backup --password=mypassword \
--extra-lsndir=backup_base | gzip > backup_base.gz
# incremental backup
$ mariadb-backup --backup --stream=mbstream \
--incremental-basedir=backup_base \
--user=mariadb-backup --password=mypassword \
--extra-lsndir=backup_inc1 | gzip > backup-inc1.gz$ mariadb-backup --prepare \
--target-dir=/var/mariadb/backup$ mariadb-backup --prepare \
--target-dir=/var/mariadb/backup \
--incremental-dir=/var/mariadb/inc1$ mariadb-backup --copy-back \
--target-dir=/var/mariadb/backup/$ chown -R mysql:mysql /var/lib/mysql/DROP PROCEDURE simpleproc;DROP PROCEDURE simpleproc;
ERROR 1305 (42000): PROCEDURE test.simpleproc does not exist
DROP PROCEDURE IF EXISTS simpleproc;
Query OK, 0 rows affected, 1 warning (0.00 sec)
SHOW WARNINGS;
+-------+------+------------------------------------------+
| Level | Code | Message |
+-------+------+------------------------------------------+
| Note | 1305 | PROCEDURE test.simpleproc does not exist |
+-------+------+------------------------------------------+$ sudo rm /var/lib/mysql/db1/t1.cfg$ sudo chown mysql:mysql /var/lib/mysql/db1/t1.*ALTER TABLE db1.t1 IMPORT TABLESPACE;SELECT * FROM db1.t1;ALTER TABLE db1.t1 FORCE, ADD FULLTEXT INDEX f_idx(f1);SHOW CREATE TABLE db1.t1\G
*************************** 1. row ***************************
Table: t1
Create Table: CREATE TABLE `t1` (
`f1` char(10) DEFAULT NULL,
FULLTEXT KEY `f_idx` (`f1`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci$ mariadb-backup --backup \
--target-dir=/var/mariadb/backup/ \
--databases='app1 app2' --tables='tab_[0-9]+' \
--user=mariadb-backup --password=mypasswordmariadb-backup --backup --databases="db1" \
--target-dir=/backup --history=partial_db1$ mariadb-backup --prepare --export \
--target-dir=/var/mariadb/backup/DROP TABLE IF EXISTS db1.t1;CREATE TABLE db1.t1(f1 CHAR(10)) ENGINE=INNODB;ALTER TABLE db1.t1 DISCARD TABLESPACE;$ sudo cp /data/backups/part/db1/t1.* /var/lib/mysql/db1SHOW INDEX FROM Employees;SHOW CREATE TABLE Employees\GCREATE TABLE `Employees` (
`ID` TINYINT(3) UNSIGNED NOT NULL AUTO_INCREMENT,
`First_Name` VARCHAR(25) NOT NULL,
`Last_Name` VARCHAR(25) NOT NULL,
`Position` VARCHAR(25) NOT NULL,
PRIMARY KEY (`ID`)
);ALTER TABLE Employees ADD PRIMARY KEY(ID);SELECT t.TABLE_SCHEMA, t.TABLE_NAME
FROM information_schema.TABLES AS t
LEFT JOIN information_schema.KEY_COLUMN_USAGE AS c
ON t.TABLE_SCHEMA = c.CONSTRAINT_SCHEMA
AND t.TABLE_NAME = c.TABLE_NAME
AND c.CONSTRAINT_NAME = 'PRIMARY'
WHERE t.TABLE_SCHEMA NOT IN ('information_schema', 'performance_schema', 'mysql', 'sys')
AND c.CONSTRAINT_NAME IS NULL;### INSERT INTO `securedb`.`t_long_keys`
### SET
### @1=1 /* INT meta=0 nullable=0 is_null=0 */
### @2='a' /* VARSTRING(4073) meta=4073 nullable=1 is_null=0 */
### @3=580 /* LONGINT meta=0 nullable=1 is_null=0 */CREATE TABLE `Employees` (
`ID` TINYINT(3) UNSIGNED NOT NULL,
`Employee_Code` VARCHAR(25) NOT NULL,
`First_Name` VARCHAR(25) NOT NULL,
PRIMARY KEY (`ID`),
UNIQUE KEY `UK_EmpCode` (`Employee_Code`) -- Naming the unique key is good practice
);ALTER TABLE Employees ADD UNIQUE `UK_HomePhone` (`Home_Phone`);CREATE UNIQUE INDEX `IX_Position` ON Employees(Position);CREATE TABLE t1 (a INT NOT NULL, b INT, UNIQUE (a,b));
INSERT INTO t1 VALUES (1,1), (2,2);
INSERT INTO t1 VALUES (2,1); -- Valid: (2,1) is unique, though '2' in 'a' and '1' in 'b' are not individually unique here.
SELECT * FROM t1;+---+------+
| a | b |
+---+------+
| 1 | 1 |
| 2 | 1 |
| 2 | 2 |
+---+------+INSERT INTO t1 VALUES (3,NULL), (3, NULL); -- Both rows are inserted
SELECT * FROM t1;+---+------+
| a | b |
+---+------+
| 1 | 1 |
| 2 | 1 |
| 2 | 2 |
| 3 | NULL |
| 3 | NULL |
+---+------+SELECT (3, NULL) = (3, NULL);+-----------------------+
| (3, NULL) = (3, NULL) |
+-----------------------+
| 0 | -- 0 means false
+-----------------------+CREATE TABLE Table_1 (
user_name VARCHAR(10),
status ENUM('Active', 'On-Hold', 'Deleted'),
del CHAR(0) AS (IF(status IN ('Active', 'On-Hold'), '', NULL)) PERSISTENT,
UNIQUE(user_name, del)
);-- Example table definition (simplified for brevity)
CREATE TABLE t_long_keys (
a INT PRIMARY KEY,
b BLOB,
c1 VARCHAR(1000),
UNIQUE KEY `uk_b` (b),
UNIQUE KEY `uk_c1` (c1)
) ENGINE=InnoDB;
-- SHOW CREATE TABLE might reveal 'USING HASH' for uk_b or uk_c1 if they exceed length limits
SHOW CREATE TABLE t_long_keys\G...
UNIQUE KEY `uk_b` (`b`) USING HASH,
...CREATE TABLE t2 (a INT NOT NULL, b INT, INDEX `idx_a_b` (a,b));
INSERT INTO t2 VALUES (1,1), (2,2), (2,2); -- Duplicate (2,2) is allowed
SELECT * FROM t2;+---+------+
| a | b |
+---+------+
| 1 | 1 |
| 2 | 2 |
| 2 | 2 |
+---+------+mariadbmariadb -h 166.78.144.191 -u username -ppassword database_name--host=name
-h name--password[=passwd]
-p[passwd]--pipe
-W--port=num
-P num--protocol=name--shared-memory-base-name=name--socket=name
-S name--ssl--ssl-ca=name--ssl-capath=name--ssl-cert=name--ssl-cipher=name--ssl-key=name--ssl-crl=name--ssl-crlpath=name--ssl-verify-server-cert--user=name
-u nameHow mariadb-backup backs up and restores encrypted data files.
Stored procedures are precompiled collections of SQL statements stored on the server, allowing for encapsulated logic, parameterized execution, and improved application performance.
mariadb-backup --copy-backSELECT plugin_name, plugin_library, @@plugin_dir FROM information_schema.plugins WHERE plugin_type='ENCRYPTION';
+---------------------+------------------------+---------------------------------------+
| plugin_name | plugin_library | @@plugin_dir |
+---------------------+------------------------+---------------------------------------+
| file_key_management | file_key_management.so | /opt/homebrew/opt/mariadb/lib/plugin/ |
+---------------------+------------------------+---------------------------------------+SHOW VARIABLES LIKE 'file_key_management%'; +------------------------------------------+------------------------------------------------+
| Variable_name | Value |
+------------------------------------------+------------------------------------------------+
| file_key_management_digest | sha1 |
| file_key_management_encryption_algorithm | aes_ctr |
| file_key_management_filekey | |
| file_key_management_filename | /opt/homebrew/etc/mysql/encryption/keyfile.txt |
| file_key_management_use_pbkdf2 | 0 |
+------------------------------------------+------------------------------------------------+mariadb-backup --backup --stream=xbstream | \ openssl enc -aes-256-cbc -k $BACKUP_PASSWORD > full_secure_backup.xb.encSELECT * FROM animal_count;
+---------+
| animals |
+---------+
| 101 |
+---------+
CALL Reset_animal_count();
SELECT * FROM animal_count;
+---------+
| animals |
+---------+
| 0 |
+---------+CREATE PROCEDURE
Withdraw /* Routine name */
(parameter_amount DECIMAL(6,2), /* Parameter list */
parameter_teller_id INTEGER,
parameter_customer_id INTEGER)
MODIFIES SQL DATA /* Data access clause */
BEGIN /* Routine body */
UPDATE Customers
SET balance = balance - parameter_amount
WHERE customer_id = parameter_customer_id;
UPDATE Tellers
SET cash_on_hand = cash_on_hand + parameter_amount
WHERE teller_id = parameter_teller_id;
INSERT INTO Transactions VALUES (
parameter_customer_id,
parameter_teller_id,
parameter_amount);
END;SHOW PROCEDURE STATUS\G
*************************** 1. row ***************************
Db: test
Name: Reset_animal_count
Type: PROCEDURE
Definer: root@localhost
Modified: 2013-06-03 08:55:03
Created: 2013-06-03 08:55:03
Security_type: DEFINER
Comment:
character_set_client: utf8
collation_connection: utf8_general_ci
Database Collation: latin1_swedish_ciSELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_TYPE='PROCEDURE';
+--------------------+
| ROUTINE_NAME |
+--------------------+
| Reset_animal_count |
+--------------------+SHOW CREATE PROCEDURE Reset_animal_count\G
*************************** 1. row ***************************
Procedure: Reset_animal_count
sql_mode:
Create Procedure: CREATE DEFINER=`root`@`localhost` PROCEDURE `Reset_animal_count`()
MODIFIES SQL DATA
UPDATE animal_count SET animals = 0
character_set_client: utf8
collation_connection: utf8_general_ci
Database Collation: latin1_swedish_ciDROP PROCEDURE Reset_animal_count();lenremstrBOTHremstrstrarea_code and the last 7 as tel_nbr.SELECT CONCAT('(', LEFT(telephone, 3), ') ',
SUBSTRING(telephone, 4, 3), '-',
MID(telephone, 7)) AS 'Telephone Number'
FROM contacts
ORDER BY LEFT(telephone, 3);strposlennewstrlennewstrpos-- Example: Change 'Mrs.' to 'Ms.' where title is embedded in a 'name' column
SELECT INSERT(name, LOCATE('Mrs.', name), LENGTH('Mrs.'), 'Ms.')
FROM contacts
WHERE name LIKE '%Mrs.%';SELECT REVERSE('MariaDB'); -- Output: BDeiraMSELECT REPEAT('Ha', 3); -- Output: HaHaHaSELECT ip_address
FROM computers
WHERE server = 'Y'
ORDER BY INET_ATON(ip_address)
LIMIT 3;SELECT CONCAT(name_first, ' ', name_last) AS Name FROM contacts;SELECT CONCAT_WS('|', col1, col2, col3) FROM table1;SELECT CONCAT('$', FORMAT(col5, 2)) AS Price FROM table3;SELECT UCASE(col1) AS Upper_Col1, LCASE(col2) AS Lower_Col2 FROM table4;SELECT LEFT(telephone, 3) AS area_code, RIGHT(telephone, 7) AS tel_nbr
FROM contacts
ORDER BY area_code;SELECT CONCAT(REPLACE(title, 'Mrs.', 'Ms.'), ' ', name_first, ' ', name_last) AS Name
FROM contacts;SELECT COUNT(school_id) AS 'Number of Students'
FROM table8
WHERE CHAR_LENGTH(school_id) = 8;SELECT RPAD(part_nbr, 8, '.') AS 'Part Nbr.', LPAD(description, 15, '_') AS Description FROM catalog;SELECT
TRIM(LEADING '.' FROM col1) AS Trimmed_Leading_Dots,
TRIM(TRAILING FROM col2) AS Trimmed_Trailing_Spaces, -- Trims spaces
TRIM(BOTH '_' FROM col3) AS Trimmed_Both_Underscores,
TRIM(col4) AS Trimmed_Spaces -- Trims leading and trailing spaces
FROM table5;--preparemariadb-bin.000096 568 0-1-2backup_type = full-backuped
from_lsn = 0
to_lsn = 1635102
last_lsn = 1635102
recover_binlog_info = 0wsrep_local_state_uuid:wsrep_last_committedd38587ce-246c-11e5-bcce-6bbd0831cc0f:1352215Discover how to create and manage views in MariaDB to simplify complex queries, restrict data access, and provide an abstraction layer over tables.
SELECT col1, col2
FROM table6
WHERE STRCMP(col3, 'text') = 0; -- Finds exact case-sensitive match for 'text'-- Get the first two elements from a pipe-delimited string
SELECT SUBSTRING_INDEX('elem1|elem2|elem3|elem4', '|', 2); -- Output: elem1|elem2
-- Get the last two elements
SELECT SUBSTRING_INDEX('elem1|elem2|elem3|elem4', '|', -2); -- Output: elem3|elem4xtrabackup_binlog_pos_innodb--no-lockxtrabackup_binlog_pos_innodbCHANGE MASTERMASTER_LOG_FILEMASTER_LOG_POSbackup_type = full-backuped
from_lsn = 0
to_lsn = 1635102
last_lsn = 1635102
recover_binlog_info = 0wsrep_local_state_uuid:wsrep_last_committedd38587ce-246c-11e5-bcce-6bbd0831cc0f:1352215mariadb-bin.000096 568 0-1-2CREATE TABLE `Employees` (
`ID` TINYINT(3) UNSIGNED NOT NULL AUTO_INCREMENT,
`First_Name` VARCHAR(25) NOT NULL,
`Last_Name` VARCHAR(25) NOT NULL,
`Position` VARCHAR(25) NOT NULL,
`Home_Address` VARCHAR(50) NOT NULL,
`Home_Phone` VARCHAR(12) NOT NULL,
PRIMARY KEY (`ID`)
) ENGINE=MyISAM;INSERT INTO `Employees` (`First_Name`, `Last_Name`, `Position`, `Home_Address`, `Home_Phone`)
VALUES
('Mustapha', 'Mond', 'Chief Executive Officer', '692 Promiscuous Plaza', '326-555-3492'),
('Henry', 'Foster', 'Store Manager', '314 Savage Circle', '326-555-3847'),
('Bernard', 'Marx', 'Cashier', '1240 Ambient Avenue', '326-555-8456'),
('Lenina', 'Crowne', 'Cashier', '281 Bumblepuppy Boulevard', '328-555-2349'),
('Fanny', 'Crowne', 'Restocker', '1023 Bokanovsky Lane', '326-555-6329'),
('Helmholtz', 'Watson', 'Janitor', '944 Soma Court', '329-555-2478');CREATE TABLE `Hours` (
`ID` TINYINT(3) UNSIGNED NOT NULL,
`Clock_In` DATETIME NOT NULL,
`Clock_Out` DATETIME NOT NULL
) ENGINE=MyISAM;INSERT INTO `Hours`
VALUES ('1', '2005-08-08 07:00:42', '2005-08-08 17:01:36'),
('1', '2005-08-09 07:01:34', '2005-08-09 17:10:11'),
('1', '2005-08-10 06:59:56', '2005-08-10 17:09:29'),
('1', '2005-08-11 07:00:17', '2005-08-11 17:00:47'),
('1', '2005-08-12 07:02:29', '2005-08-12 16:59:12'),
('2', '2005-08-08 07:00:25', '2005-08-08 17:03:13'),
('2', '2005-08-09 07:00:57', '2005-08-09 17:05:09'),
('2', '2005-08-10 06:58:43', '2005-08-10 16:58:24'),
('2', '2005-08-11 07:01:58', '2005-08-11 17:00:45'),
('2', '2005-08-12 07:02:12', '2005-08-12 16:58:57'),
('3', '2005-08-08 07:00:12', '2005-08-08 17:01:32'),
('3', '2005-08-09 07:01:10', '2005-08-09 17:00:26'),
('3', '2005-08-10 06:59:53', '2005-08-10 17:02:53'),
('3', '2005-08-11 07:01:15', '2005-08-11 17:04:23'),
('3', '2005-08-12 07:00:51', '2005-08-12 16:57:52'),
('4', '2005-08-08 06:54:37', '2005-08-08 17:01:23'),
('4', '2005-08-09 06:58:23', '2005-08-09 17:00:54'),
('4', '2005-08-10 06:59:14', '2005-08-10 17:00:12'),
('4', '2005-08-11 07:00:49', '2005-08-11 17:00:34'),
('4', '2005-08-12 07:01:09', '2005-08-12 16:58:29'),
('5', '2005-08-08 07:00:04', '2005-08-08 17:01:43'),
('5', '2005-08-09 07:02:12', '2005-08-09 17:02:13'),
('5', '2005-08-10 06:59:39', '2005-08-10 17:03:37'),
('5', '2005-08-11 07:01:26', '2005-08-11 17:00:03'),
('5', '2005-08-12 07:02:15', '2005-08-12 16:59:02'),
('6', '2005-08-08 07:00:12', '2005-08-08 17:01:02'),
('6', '2005-08-09 07:03:44', '2005-08-09 17:00:00'),
('6', '2005-08-10 06:54:19', '2005-08-10 17:03:31'),
('6', '2005-08-11 07:00:05', '2005-08-11 17:02:57'),
('6', '2005-08-12 07:02:07', '2005-08-12 16:58:23');SELECT
`Employees`.`First_Name`,
`Employees`.`Last_Name`,
`Hours`.`Clock_In`,
`Hours`.`Clock_Out`
FROM `Employees`
INNER JOIN `Hours` ON `Employees`.`ID` = `Hours`.`ID`
WHERE `Employees`.`First_Name` = 'Helmholtz'
AND DATE_FORMAT(`Hours`.`Clock_In`, '%Y-%m-%d') >= '2005-08-08'
AND DATE_FORMAT(`Hours`.`Clock_In`, '%Y-%m-%d') <= '2005-08-12'
AND DATE_FORMAT(`Hours`.`Clock_In`, '%H:%i:%S') > '07:00:59';+------------+-----------+---------------------+---------------------+
| First_Name | Last_Name | Clock_In | Clock_Out |
+------------+-----------+---------------------+---------------------+
| Helmholtz | Watson | 2005-08-09 07:03:44 | 2005-08-09 17:00:00 |
| Helmholtz | Watson | 2005-08-12 07:02:07 | 2005-08-12 16:58:23 |
+------------+-----------+---------------------+---------------------+SELECT
`Employees`.`First_Name`,
`Employees`.`Last_Name`,
`Hours`.`Clock_In`,
`Hours`.`Clock_Out`,
(TIMESTAMPDIFF(MINUTE,`Hours`.`Clock_Out`,`Hours`.`Clock_In`) + 601) AS Difference
FROM `Employees`
INNER JOIN `Hours` USING (`ID`)
WHERE DATE_FORMAT(`Hours`.`Clock_In`, '%Y-%m-%d') >= '2005-08-08'
AND DATE_FORMAT(`Hours`.`Clock_In`, '%Y-%m-%d') <= '2005-08-12'
AND DATE_FORMAT(`Hours`.`Clock_In`, '%H:%i:%S') > '07:00:59'
AND TIMESTAMPDIFF(MINUTE,`Hours`.`Clock_Out`,`Hours`.`Clock_In`) > -601;+------------+-----------+---------------------+---------------------+------------+
| First_Name | Last_Name | Clock_In | Clock_Out | Difference |
+------------+-----------+---------------------+---------------------+------------+
| Mustapha | Mond | 2005-08-12 07:02:29 | 2005-08-12 16:59:12 | 4 |
| Henry | Foster | 2005-08-11 07:01:58 | 2005-08-11 17:00:45 | 2 |
| Henry | Foster | 2005-08-12 07:02:12 | 2005-08-12 16:58:57 | 4 |
| Bernard | Marx | 2005-08-09 07:01:10 | 2005-08-09 17:00:26 | 1 |
| Lenina | Crowne | 2005-08-12 07:01:09 | 2005-08-12 16:58:29 | 3 |
| Fanny | Crowne | 2005-08-11 07:01:26 | 2005-08-11 17:00:03 | 2 |
| Fanny | Crowne | 2005-08-12 07:02:15 | 2005-08-12 16:59:02 | 4 |
| Helmholtz | Watson | 2005-08-09 07:03:44 | 2005-08-09 17:00:00 | 4 |
| Helmholtz | Watson | 2005-08-12 07:02:07 | 2005-08-12 16:58:23 | 4 |
+------------+-----------+---------------------+---------------------+------------+CREATE SQL SECURITY INVOKER VIEW Employee_Tardiness AS
SELECT
`Employees`.`First_Name`,
`Employees`.`Last_Name`,
`Hours`.`Clock_In`,
`Hours`.`Clock_Out`,
(TIMESTAMPDIFF(MINUTE,`Hours`.`Clock_Out`,`Hours`.`Clock_In`) + 601) as Difference
FROM `Employees`
INNER JOIN `Hours` USING (`ID`)
WHERE DATE_FORMAT(`Hours`.`Clock_In`, '%Y-%m-%d') >= '2005-08-08'
AND DATE_FORMAT(`Hours`.`Clock_In`, '%Y-%m-%d') <= '2005-08-12'
AND DATE_FORMAT(`Hours`.`Clock_In`, '%H:%i:%S') > '07:00:59'
AND TIMESTAMPDIFF(MINUTE,`Hours`.`Clock_Out`,`Hours`.`Clock_In`) > -601;SELECT * FROM Employee_Tardiness;+------------+-----------+---------------------+---------------------+------------+
| First_Name | Last_Name | Clock_In | Clock_Out | Difference |
+------------+-----------+---------------------+---------------------+------------+
| Mustapha | Mond | 2005-08-12 07:02:29 | 2005-08-12 16:59:12 | 5 |
| Henry | Foster | 2005-08-11 07:01:58 | 2005-08-11 17:00:45 | 3 |
| Henry | Foster | 2005-08-12 07:02:12 | 2005-08-12 16:58:57 | 5 |
| Bernard | Marx | 2005-08-09 07:01:10 | 2005-08-09 17:00:26 | 2 |
| Lenina | Crowne | 2005-08-12 07:01:09 | 2005-08-12 16:58:29 | 4 |
| Fanny | Crowne | 2005-08-09 07:02:12 | 2005-08-09 17:02:13 | 1 |
| Fanny | Crowne | 2005-08-11 07:01:26 | 2005-08-11 17:00:03 | 3 |
| Fanny | Crowne | 2005-08-12 07:02:15 | 2005-08-12 16:59:02 | 5 |
| Helmholtz | Watson | 2005-08-09 07:03:44 | 2005-08-09 17:00:00 | 5 |
| Helmholtz | Watson | 2005-08-12 07:02:07 | 2005-08-12 16:58:23 | 5 |
+------------+-----------+---------------------+---------------------+------------+SELECT * FROM Employee_Tardiness WHERE Difference >=5;+------------+-----------+---------------------+---------------------+------------+
| First_Name | Last_Name | Clock_In | Clock_Out | Difference |
+------------+-----------+---------------------+---------------------+------------+
| Mustapha | Mond | 2005-08-12 07:02:29 | 2005-08-12 16:59:12 | 5 |
| Henry | Foster | 2005-08-12 07:02:12 | 2005-08-12 16:58:57 | 5 |
| Fanny | Crowne | 2005-08-12 07:02:15 | 2005-08-12 16:59:02 | 5 |
| Helmholtz | Watson | 2005-08-09 07:03:44 | 2005-08-09 17:00:00 | 5 |
| Helmholtz | Watson | 2005-08-12 07:02:07 | 2005-08-12 16:58:23 | 5 |
+------------+-----------+---------------------+---------------------+------------+Understand how to work with date and time values in MariaDB, including data types like DATETIME and TIMESTAMP, and useful temporal functions.
YEAR_MONTHDAY_HOURHOUR_MINUTEINSERT INTO billable_work (doctor_id, patient_id, session_date)
VALUES ('1021', '1256', CURRENT_DATE);SELECT rec_id, doctor_id, patient_id, session_date
FROM billable_work
WHERE rec_id = LAST_INSERT_ID();+--------+-----------+------------+--------------+
| rec_id | doctor_id | patient_id | session_date |
+--------+-----------+------------+--------------+
| 2462 | 1021 | 1256 | 2025-05-28 | -- Example date
+--------+-----------+------------+--------------+UPDATE billable_work
SET session_time = CURTIME()
WHERE rec_id = '2462';
SELECT patient_id, session_date, session_time
FROM billable_work
WHERE rec_id = '2462';+------------+--------------+--------------+
| patient_id | session_date | session_time |
+------------+--------------+--------------+
| 1256 | 2025-05-28 | 13:03:22 | -- Example time
+------------+--------------+--------------+SELECT
MONTH(session_date) AS Month,
DAYOFMONTH(session_date) AS Day,
YEAR(session_date) AS Year
FROM billable_work
WHERE rec_id = '2462';+-------+------+------+
| Month | Day | Year |
+-------+------+------+
| 5 | 28 | 2025 | -- Example output
+-------+------+------+SELECT
patient_id AS 'Patient ID',
session_date AS 'Date of Session',
IF(DAYOFWEEK(session_date) = 7, 1.5, 1.0) AS 'Billing Rate'
FROM billable_work
WHERE rec_id = '2462';SELECT patient_id, session_date
FROM billable_work
WHERE QUARTER(session_date) = 2;SET @target_quarter := 2;
SELECT patient_id, COUNT(*) AS num_sessions
FROM billable_work
WHERE QUARTER(session_date) = @target_quarter AND doctor_id = '1021'
GROUP BY patient_id;SELECT
HOUR(session_time) AS Hour,
MINUTE(session_time) AS Minute,
SECOND(session_time) AS Second
FROM billable_work
WHERE rec_id = '2462';+------+--------+--------+
| Hour | Minute | Second |
+------+--------+--------+
| 13 | 03 | 22 | -- Example output
+------+--------+--------+SELECT
patient_name AS Patient,
EXTRACT(HOUR FROM appointment) AS Hour,
EXTRACT(MINUTE FROM appointment) AS Minute
FROM billable_work
JOIN patients ON billable_work.patient_id = patients.patient_id
WHERE doctor_id = '1021'
AND EXTRACT(MONTH FROM appointment) = 5
AND EXTRACT(DAY FROM appointment) = 28;SELECT
patient_name AS Patient,
EXTRACT(HOUR_MINUTE FROM appointment) AS AppointmentHM
FROM billable_work
JOIN patients ON billable_work.patient_id = patients.patient_id
WHERE doctor_id = '1021';SELECT
patient_name AS Patient,
CONCAT(
DAYNAME(appointment), ' - ',
MONTHNAME(appointment), ' ',
DAYOFMONTH(appointment), ', ',
YEAR(appointment)
) AS Appointment
FROM billable_work
JOIN patients ON billable_work.patient_id = patients.patient_id
WHERE doctor_id = '1021' AND DATE(appointment) = '2025-05-28'
LIMIT 1;+-------------------+------------------------------+
| Patient | Appointment |
+-------------------+------------------------------+
| Michael Zabalaoui | Wednesday - May 28, 2025 | -- Example
+-------------------+------------------------------+SELECT
patient_name AS Patient,
DATE_FORMAT(appointment, '%W - %M %e, %Y') AS Appointment
FROM billable_work
JOIN patients ON billable_work.patient_id = patients.patient_id
WHERE doctor_id = '1021' AND DATE_FORMAT(appointment, '%c') = 5 -- Filter by month 5 (May)
LIMIT 1;SELECT
DATE_FORMAT(appointment, '%W - %M %e, %Y at %r') AS Appointment
FROM billable_work
LIMIT 1;+-------------------------------------------------+
| Appointment |
+-------------------------------------------------+
| Wednesday - May 28, 2025 at 01:03:22 PM | -- Example
+-------------------------------------------------+SELECT
patient_name AS Patient,
TIME_FORMAT(appointment, '%l:%i %p') AS AppointmentTime
FROM billable_work
JOIN patients ON billable_work.patient_id = patients.patient_id
WHERE doctor_id = '1021'
AND DATE(appointment) = CURDATE();+-------------------+-----------------+
| Patient | AppointmentTime |
+-------------------+-----------------+
| Michael Zabalaoui | 1:03 PM | -- Example
+-------------------+-----------------+$ netstat -ln | grep mysqldsudo mariadbERROR 2002 (HY000): Can't connect to local MySQL server through
socket '/var/run/mysqld/mysqld.sock' (2 "No such file or directory")mariadb -u someuser -p --port=3307 --protocol=tcp
ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost'
(111 "Connection refused")$ mariadb-admin status
mariadb-admin: connect to server at 'localhost' failed
error: 'Can't connect to local server through socket '/tmp/mysql.sock' (2)'
Check that mariadbd is running and that the socket: '/tmp/mysql.sock' exists!$ mariadb --host=myhost --protocol=tcp --port=3306 test
ERROR 2002 (HY000): Can't connect to MySQL server on 'myhost' (115)$ telnet myhost 3306$ perror 115OS error code 115: Operation now in progressUSE test;
ERROR 1044 (42000): Access denied for user 'youruser'@'yourhost' to database 'test'-- User created with '%' host
CREATE USER 'melisa'@'%' IDENTIFIED BY 'password';
-- Checking users in mysql.user table
SELECT user, host FROM mysql.user WHERE user='melisa' OR user='';+--------+-----------+
| user | host |
+--------+-----------+
| melisa | % |
| | localhost | -- An anonymous user for localhost
+--------+-----------+SET PASSWORD FOR 'bob'@'%.loc.gov' = 'newpass'; (which might store the password as plain text, potentially leading to issues depending on the authentication plugin).GRANT ALL ON *.* to 'myadmin'@'localhost' IDENTIFIED BY '(your_password)' WITH GRANT OPTIONunix 2 [ ACC ] STREAM LISTENING 33209505 /var/run/mysqld/mysqld.sock$ mariadb --no-defaults ...SET PASSWORD FOR 'root'@'localhost' = PASSWORD('your_new_strong_password');CREATE USER 'melisa'@'localhost' IDENTIFIED BY 'password_for_melisa_localhost';
GRANT ALL PRIVILEGES ON yourdatabase.* TO 'melisa'@'localhost'; -- Grant necessary privilegesDROP USER ''@'localhost';Complete guide to creating tables in MariaDB. Complete CREATE TABLE syntax for data types, constraints, indexes, and storage engines for production use.
CREATE [OR REPLACE] [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
(create_definition,...) [table_options ]... [partition_options]
CREATE [OR REPLACE] [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
[(create_definition,...)] [table_options ]... [partition_options]
select_statement
CREATE [OR REPLACE] [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
{ LIKE old_table_name | (LIKE old_table_name) }
select_statement:
[IGNORE | REPLACE] [AS] SELECT ... (Some legal select statement)HASHORDER BYVALUES INRANGECREATE OR REPLACE TABLE table_name (a INT);DROP TABLE IF EXISTS TABLE_NAME;
CREATE TABLE TABLE_NAME (a INT);CREATE VIEW v (mycol) AS SELECT 'abc';
CREATE TABLE v2 LIKE v;
ERROR 1347 (HY000): 'test.v' is not of type 'BASE TABLE'CREATE OR REPLACE TABLE x (d DATE DEFAULT '0000-00-00');
SET SQL_MODE='NO_ZERO_DATE';
CREATE OR REPLACE TABLE y LIKE x;
ERROR 1067 (42000): Invalid default value for 'd'CREATE TABLE test (a INT NOT NULL, b CHAR(10)) ENGINE=MyISAM
SELECT 5 AS b, c, d FROM another_table;ERROR 1050 (42S01): Table 't' already existscreate_definition:
{ col_name column_definition | index_definition | period_definition | CHECK (expr) }
column_definition:
data_type
[NOT NULL | NULL] [DEFAULT default_value | (expression)]
[ON UPDATE [NOW | CURRENT_TIMESTAMP] [(precision)]]
[AUTO_INCREMENT] [ZEROFILL] [UNIQUE [KEY] | [PRIMARY] KEY]
[INVISIBLE] [{WITH|WITHOUT} SYSTEM VERSIONING]
[COMMENT 'string'] [REF_SYSTEM_ID = value]
[reference_definition]
| data_type [GENERATED ALWAYS]
AS [ ROW {START|END} [NOT NULL ENABLE] [[PRIMARY] KEY]
| (expression) [VIRTUAL | PERSISTENT | STORED] ]
[INVISIBLE] [UNIQUE [KEY]] [COMMENT 'string']
constraint_definition:
CONSTRAINT [constraint_name] CHECK (expression)CREATE TABLE b(for_key INT REFERENCES a(not_key));CREATE TABLE b(for_key INT REFERENCES a(not_key));CREATE TABLE t1 (a INT DEFAULT (1+1), b INT DEFAULT (a+1));
CREATE TABLE t2 (a BIGINT PRIMARY KEY DEFAULT UUID_SHORT());### INSERT INTO `securedb`.`t_long_keys`
### SET
### @1=1 /* INT meta=0 nullable=0 is_null=0 */
### @2='a' /* VARSTRING(4073) meta=4073 nullable=1 is_null=0 */
### @3=580 /* LONGINT meta=0 nullable=1 is_null=0 */CREATE TABLE t_long_keys ( a INT PRIMARY KEY, b VARCHAR(4073), UNIQUE KEY `uk_b` (b) ) ENGINE=InnoDB;
Query OK, 0 rows affected (0.022 sec)
show create table t_long_keys\G
*************************** 1. row ***************************
Table: t_long_keys
Create Table: CREATE TABLE `t_long_keys` (
`a` int(11) NOT NULL,
`b` varchar(4073) DEFAULT NULL,
PRIMARY KEY (`a`),
UNIQUE KEY `uk_b` (`b`) USING HASH
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
1 row in set (0.001 sec)
select * from information_schema.INNODB_SYS_TABLES where name like '%t_long_keys%';;
+----------+----------------------+------+--------+-------+------------+---------------+------------+
| TABLE_ID | NAME | FLAG | N_COLS | SPACE | ROW_FORMAT | ZIP_PAGE_SIZE | SPACE_TYPE |
+----------+----------------------+------+--------+-------+------------+---------------+------------+
| 64 | securedb/t_long_keys | 33 | 5 | 43 | Dynamic | 0 | Single |
+----------+----------------------+------+--------+-------+------------+---------------+------------+
1 row in set (0.003 sec)
select * from information_schema.INNODB_SYS_COLUMNS where TABLE_ID=64;
+----------+---------------+-------+-------+--------+------+
| TABLE_ID | NAME | POS | MTYPE | PRTYPE | LEN |
+----------+---------------+-------+-------+--------+------+
| 64 | a | 0 | 6 | 1283 | 4 |
| 64 | b | 1 | 1 | 528399 | 4073 |
| 64 | DB_ROW_HASH_1 | 65538 | 6 | 9736 | 8 |
+----------+---------------+-------+-------+--------+------+
CREATE TABLE t1(g GEOMETRY(9,4) REF_SYSTEM_ID=101);index_definition:
{INDEX|KEY} [index_name] [index_type] (index_col_name,...) [index_option] ...
{{{|}}} {FULLTEXT|SPATIAL} [INDEX|KEY] [index_name] (index_col_name,...) [index_option] ...
{{{|}}} [CONSTRAINT [symbol]] PRIMARY KEY [index_type] (index_col_name,...) [index_option] ...
{{{|}}} [CONSTRAINT [symbol]] UNIQUE [INDEX|KEY] [index_name] [index_type] (index_col_name,...) [index_option] ...
{{{|}}} [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name,...) reference_definition
index_col_name:
col_name [(length)] [ASC | DESC]
index_type:
USING {BTREE | HASH | RTREE}
index_option:
[ KEY_BLOCK_SIZE [=] value
{{{|}}} index_type
{{{|}}} WITH PARSER parser_name
{{{|}}} VISIBLE
{{{|}}} COMMENT 'string'
{{{|}}} CLUSTERING={YES| NO} ]
[ IGNORED | NOT IGNORED ]
reference_definition:
REFERENCES tbl_name (index_col_name,...)
[MATCH FULL | MATCH PARTIAL | MATCH SIMPLE]
[ON DELETE reference_option]
[ON UPDATE reference_option]
reference_option:
RESTRICT | CASCADE | SET NULL | NO ACTIONperiod_definition:
PERIOD FOR [time_period_name | SYSTEM_TIME] (start_column_name, end_column_name)CREATE TABLE t1 (a INT CHECK(a>0) ,b INT CHECK (b> 0), CONSTRAINT abc CHECK (a>b));<OPTION_NAME> = <option_value>, [<OPTION_NAME> = <option_value> ...]table_option:
[STORAGE] ENGINE [=] engine_name
| AUTO_INCREMENT [=] number
| AVG_ROW_LENGTH [=] number
| [DEFAULT] CHARACTER SET [=] <a data-footnote-ref href="#user-content-fn-7">charset_name</a>
| CHECKSUM [=] {0 | 1}
| [DEFAULT] COLLATE [=] <a data-footnote-ref href="#user-content-fn-7">collation_name</a>
| COMMENT [=] 'string'
| CONNECTION [=] 'connect_string'
| DATA DIRECTORY [=] 'absolute path to directory'
| DELAY_KEY_WRITE [=] {0 | 1}
| ENCRYPTED [=] {YES | NO}
| ENCRYPTION_KEY_ID [=] number
| IETF_QUOTES [=] {YES | NO}
| INDEX DIRECTORY [=] 'absolute path to directory'
| INSERT_METHOD [=] { NO | FIRST | LAST }
| KEY_BLOCK_SIZE [=] number
| MAX_ROWS [=] number
| MIN_ROWS [=] number
| PACK_KEYS [=] {0 | 1 | DEFAULT}
| PAGE_CHECKSUM [=] {0 | 1}
| PAGE_COMPRESSED [=] {0 | 1}
| PAGE_COMPRESSION_LEVEL [=] {0 .. 9}
| PASSWORD [=] 'string'
| ROW_FORMAT [=] {DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT|PAGE}
| SEQUENCE [=] {0|1}
| STATS_AUTO_RECALC [=] {DEFAULT|0|1}
| STATS_PERSISTENT [=] {DEFAULT|0|1}
| STATS_SAMPLE_PAGES [=] {DEFAULT|number}
| TABLESPACE tablespace_name
| TRANSACTIONAL [=] {0 | 1}
| UNION [=] (tbl_name[,tbl_name]...)
| WITH SYSTEM VERSIONINGpartition_options:
PARTITION BY
{ [LINEAR] HASH(expr)
| [LINEAR] KEY(column_list)
| RANGE(expr)
| LIST(expr)
| SYSTEM_TIME [INTERVAL time_quantity <a data-footnote-ref href="#user-content-fn-8">time_unit</a>] [LIMIT num] }
[PARTITIONS num]
[SUBPARTITION BY
{ [LINEAR] HASH(expr)
| [LINEAR] KEY(column_list) }
[SUBPARTITIONS num]
]
[(partition_definition [, partition_definition] ...)]
partition_definition:
[PARTITION] partition_name
[VALUES {LESS THAN {(expr) | MAXVALUE} | IN (value_list)}]
[[STORAGE] ENGINE [=] engine_name]
[COMMENT [=] 'comment_text' ]
[DATA DIRECTORY [=] 'data_dir']
[INDEX DIRECTORY [=] 'index_dir']
[MAX_ROWS [=] max_number_of_rows]
[MIN_ROWS [=] min_number_of_rows]
[TABLESPACE [=] tablespace_name]
[NODEGROUP [=] node_group_id]
[(subpartition_definition [, subpartition_definition] ...)]
subpartition_definition:
SUBPARTITION logical_name
[[STORAGE] ENGINE [=] engine_name]
[COMMENT [=] 'comment_text' ]
[DATA DIRECTORY [=] 'data_dir']
[INDEX DIRECTORY [=] 'index_dir']
[MAX_ROWS [=] max_number_of_rows]
[MIN_ROWS [=] min_number_of_rows]
[TABLESPACE [=] tablespace_name]
[NODEGROUP [=] node_group_id]CREATE TABLE t1 (a INT, b CHAR(5), c DATETIME)
PARTITION BY HASH ( YEAR(c) );CREATE OR REPLACE TABLE t1 (x INT)
PARTITION BY RANGE(x) (
PARTITION p1 VALUES LESS THAN (10),
PARTITION p2 VALUES LESS THAN (20),
PARTITION p3 VALUES LESS THAN (30),
PARTITION p4 VALUES LESS THAN (40),
PARTITION p5 VALUES LESS THAN (50),
PARTITION pn VALUES LESS THAN MAXVALUE);CREATE OR REPLACE TABLE t1 (x INT)
PARTITION BY RANGE(x) (
p1 VALUES LESS THAN (10),
p2 VALUES LESS THAN (20),
p3 VALUES LESS THAN (30),
p4 VALUES LESS THAN (40),
p5 VALUES LESS THAN (50),
pn VALUES LESS THAN MAXVALUE);CREATE OR REPLACE TABLE t1 (x INT)
PARTITION BY RANGE(x) (
PARTITION p1 VALUES LESS THAN (10),
PARTITION p2 VALUES LESS THAN (20),
PARTITION p3 VALUES LESS THAN (30),
PARTITION p4 VALUES LESS THAN (40),
PARTITION p5 VALUES LESS THAN (50),
PARTITION pn VALUES LESS THAN MAXVALUE);CREATE TABLE IF NOT EXISTS test (
a BIGINT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(128) CHARSET utf8,
KEY name (name(32))
) ENGINE=InnoDB DEFAULT CHARSET latin1;CREATE TABLE t1(
a INT DEFAULT (1+1),
b INT DEFAULT (a+1),
expires DATETIME DEFAULT(NOW() + INTERVAL 1 YEAR),
x BLOB DEFAULT USER()
);