![]() |
||||||||||||||||||||||||||||||||||||||||||||||||
October 8, 2025 Wednesday 12:46 AM
|
Installing the Database Server Components
First we need to install the database server. We'll use mysql in this example, others install the same way.
[ note: we'll add php, php-fpm and php-mysqli the same way later, for use within the webserver environment, don't forget ] [root@localhost ~]# dnf -y install mysql-server ..... Installed: mariadb-connector-c-config-3.2.6-1.el9.noarch mecab-0.996-3.el9.3.x86_64 mysql-8.0.30-3.el9.x86_64 mysql-common-8.0.30-3.el9.x86_64 mysql-errmsg-8.0.30-3.el9.x86_64 mysql-selinux-1.0.5-1.el9.noarch mysql-server-8.0.30-3.el9.x86_64 protobuf-lite-3.14.0-13.el9.x86_64 Complete!Set it up to boot with each server startup [root@localhost ~]# systemctl enable --now mysqld Created symlink /etc/systemd/system/multi-user.target.wants/mysqld.service → /usr/lib/systemd/system/mysqld.service.
Setting the initial Configuration
[root@localhost ~]# mysql_secure_installation Securing the MySQL server deployment. Connecting to MySQL using a blank password. VALIDATE PASSWORD COMPONENT can be used to test passwords and improve security. It checks the strength of password and allows the users to set only those passwords which are secure enough. Would you like to setup VALIDATE PASSWORD component? # enable password validation policy or not Press y|Y for Yes, any other key for No: y There are three levels of password validation policy: LOW Length >= 8 MEDIUM Length >= 8, numeric, mixed case, and special characters STRONG Length >= 8, numeric, mixed case, special characters and dictionary file # select password validation policy if enabled Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 1 Please set the password for root here. # set MySQL root password New password:M7newPa55_word Re-enter new password:M7newPa55_word # confirmation of the password you input Estimated strength of the password: 100 Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y By default, a MySQL installation has an anonymous user, allowing anyone to log into MySQL without having to have a user account created for them. This is intended only for testing, and to make the installation go a bit smoother. You should remove them before moving into a production environment. # remove anonymous users or not Remove anonymous users? (Press y|Y for Yes, any other key for No) : y Success. Normally, root should only be allowed to connect from 'localhost'. This ensures that someone cannot guess at the root password from the network. # disallow root login remotely or not Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y Success. By default, MySQL comes with a database named 'test' that anyone can access. This is also intended only for testing, and should be removed before moving into a production environment. # remove test database or not Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y - Dropping test database... Success. - Removing privileges on test database... Success. Reloading the privilege tables will ensure that all changes made so far will take effect immediately. # reload privilege tables or not Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y Success. All done!
IF, and this is a big IF, you want to allow access to the mysql server from outside the server, you'll need to modify the firewall rules.
[root@localhost ~]# firewall-cmd --add-service=mysql success [root@localhost ~]# firewall-cmd --runtime-to-permanent successNote that this is not necessary if your only use will be for internal web pages or other internal (to this server) functions. It WILL be necessary if you intend to use IoT device logging. More helpful Information Install MySQL to configure Database Server. Logging in Manually
NOTE: after you get into mysql, remember that ALL commands are terminated with a semi-colon;
Login with the username 'root' with the following command. It will prompt you for the newly generated password. Then get help on the SHOW command. [root@localhost ~]# mysql -u root -p Enter password: M7newPa55_word Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 10 Server version: 8.0.30 Source distribution Copyright (c) 2000, 2022, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> help show; Name: 'SHOW' Description: SHOW has many forms that provide information about databases, tables, columns, or status information about the server. This section describes those following: SHOW {BINARY | MASTER} LOGS SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count] SHOW {CHARACTER SET | CHARSET} [like_or_where] SHOW COLLATION [like_or_where] SHOW [FULL] COLUMNS FROM tbl_name [FROM db_name] [like_or_where] SHOW CREATE DATABASE db_name SHOW CREATE EVENT event_name SHOW CREATE FUNCTION func_name SHOW CREATE PROCEDURE proc_name SHOW CREATE TABLE tbl_name SHOW CREATE TRIGGER trigger_name SHOW CREATE VIEW view_name SHOW DATABASES [like_or_where] SHOW ENGINE engine_name {STATUS | MUTEX} SHOW [STORAGE] ENGINES SHOW ERRORS [LIMIT [offset,] row_count] SHOW EVENTS SHOW FUNCTION CODE func_name SHOW FUNCTION STATUS [like_or_where] SHOW GRANTS FOR user SHOW INDEX FROM tbl_name [FROM db_name] SHOW MASTER STATUS SHOW OPEN TABLES [FROM db_name] [like_or_where] SHOW PLUGINS SHOW PROCEDURE CODE proc_name SHOW PROCEDURE STATUS [like_or_where] SHOW PRIVILEGES SHOW [FULL] PROCESSLIST SHOW PROFILE [types] [FOR QUERY n] [OFFSET n] [LIMIT n] SHOW PROFILES SHOW RELAYLOG EVENTS [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count] SHOW {REPLICAS | SLAVE HOSTS} SHOW {REPLICA | SLAVE} STATUS [FOR CHANNEL channel] SHOW [GLOBAL | SESSION] STATUS [like_or_where] SHOW TABLE STATUS [FROM db_name] [like_or_where] SHOW [FULL] TABLES [FROM db_name] [like_or_where] SHOW TRIGGERS [FROM db_name] [like_or_where] SHOW [GLOBAL | SESSION] VARIABLES [like_or_where] SHOW WARNINGS [LIMIT [offset,] row_count] like_or_where: { LIKE 'pattern' | WHERE expr } If the syntax for a given SHOW statement includes a LIKE 'pattern' part, 'pattern' is a string that can contain the SQL % and _ wildcard characters. The pattern is useful for restricting statement output to matching values. Several SHOW statements also accept a WHERE clause that provides more flexibility in specifying which rows to display.See https://dev.mysql.com/doc/refman/8.0/en/extended-show.html. In SHOW statement results, user names and host names are quoted using backticks (`).URL: https://dev.mysql.com/doc/refman/8.0/en/show.html Let's see what databases already exist in the default configuration mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.01 sec)In order to look inside a database, you must set the scope to that database, or "use" it. mysql>use mysql; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changedLet's see what tables are created within the mysql database during the initial installation mysql> show tables; +------------------------------------------------------+ | Tables_in_mysql | +------------------------------------------------------+ | columns_priv | | component | | db | | default_roles | | engine_cost | | func | | general_log | | global_grants | | gtid_executed | | help_category | | help_keyword | | help_relation | | help_topic | | innodb_index_stats | | innodb_table_stats | | password_history | | plugin | | procs_priv | | proxies_priv | | replication_asynchronous_connection_failover | | replication_asynchronous_connection_failover_managed | | replication_group_configuration_version | | replication_group_member_actions | | role_edges | | server_cost | | servers | | slave_master_info | | slave_relay_log_info | | slave_worker_info | | slow_log | | tables_priv | | time_zone | | time_zone_leap_second | | time_zone_name | | time_zone_transition | | time_zone_transition_type | | user | +------------------------------------------------------+ 37 rows in set (0.00 sec)What kind of items are stored in the 'db' database? mysql> describe db; +-----------------------+---------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------------------+---------------+------+-----+---------+-------+ | Host | char(255) | NO | PRI | | | | Db | char(64) | NO | PRI | | | | User | char(32) | NO | PRI | | | | Select_priv | enum('N','Y') | NO | | N | | | Insert_priv | enum('N','Y') | NO | | N | | | Update_priv | enum('N','Y') | NO | | N | | | Delete_priv | enum('N','Y') | NO | | N | | | Create_priv | enum('N','Y') | NO | | N | | | Drop_priv | enum('N','Y') | NO | | N | | | Grant_priv | enum('N','Y') | NO | | N | | | References_priv | enum('N','Y') | NO | | N | | | Index_priv | enum('N','Y') | NO | | N | | | Alter_priv | enum('N','Y') | NO | | N | | | Create_tmp_table_priv | enum('N','Y') | NO | | N | | | Lock_tables_priv | enum('N','Y') | NO | | N | | | Create_view_priv | enum('N','Y') | NO | | N | | | Show_view_priv | enum('N','Y') | NO | | N | | | Create_routine_priv | enum('N','Y') | NO | | N | | | Alter_routine_priv | enum('N','Y') | NO | | N | | | Execute_priv | enum('N','Y') | NO | | N | | | Event_priv | enum('N','Y') | NO | | N | | | Trigger_priv | enum('N','Y') | NO | | N | | +-----------------------+---------------+------+-----+---------+-------+ 22 rows in set (0.00 sec)From the description, it looks like mysql limits database names to 64 characters in length, users to 32 character names, and hostnames to 255 characters. Note that changing these values will NOT change the limits within the mysql server. They are hard-coded and limited elsewhere, but this is a good reminder of where those values can be referenced should you need them. This query response also introduces us to things called privileges associated with specific databases and users. More on that later. mysql> exit; Bye It's probably a good time to discuss Database Terminology
First, bookmark the reference manual for your version of mysql. You'll want to keep this handy.
Databases are collections of related data, perhaps analogous to a workbook in spreadsheet vernacular. In our database world, the database itself is a collection of tables. There can be many databases supported by the mysql server. Tables can be considered a two-dimensional group of information, much like a worksheet made up of rows and columns. The table is created by naming it and providing a list of column names and their associated datatypes. The basic definition is like "id int" or "name char(50)". In these examples, the field named 'id' will be a variable containing only integer values. Similarly, the 'name' field will be a string of up to 50 characters. For far more information, visit the Data Types manual pages to learn about the other data types: date, time, float, timestamps, and how to size or limit their values. The Columns are like individual data cells within a worksheet row to continue the spreadsheet example. Each column represents a specific type of information like "name", or "address" or "driver's license number" as shown in the Table definition. When the table is created, it's like putting the column headings on a spreadsheet. Column A1 contains the id, column A2 contains the name, etc. Just like in most worksheets, Rows are the complete data set for an individual entry. Using and extending the data mentioned in Columns, a specific person's 'row' (or record) in the driver's license database would probably contain a unique id (Driver's License number), their name, address, phone number, hair color, height, organ donor selection, DL class, and other things related to their specific license. MySQL: Getting Information About Databases and Tables Creating a Database
So let's create a simple database, with a simple table containing a few items
[root@localhost ~]# mysql -u root -p Enter password: M7newPa55_word Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 10 Server version: 8.0.30 Source distribution Copyright (c) 2000, 2022, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> create database addressbook; Query OK, 1 row affected (0.06 sec) mysql> use addressbook; Database changed mysql> create table myfriends (id int, name varchar(50), address varchar(150), phone char(10), createdate timestamp, primary key (id)); Query OK, 0 rows affected (0.58 sec)Now the database has been created, the first table is created and the columns defined, let's add some records (rows): mysql> insert into myfriends(id, name, address, phone, createdate) values ("1", "Adam", "120 This Street", "5121234567", now()); Query OK, 1 row affected (0.07 sec) mysql> insert into myfriends(id, name, address, phone, createdate) values ("2", "Eve", "131 That Street", "5123456789", now()); Query OK, 1 row affected (0.07 sec) mysql> insert into myfriends(id, name, address, phone, createdate) values ("3", "Cain", "142 That Other Street", "2141234567", now()); Query OK, 1 row affected (0.05 sec) mysql> insert into myfriends(id, name, address, phone, createdate) values ("4", "Able", "153 Some Other Street", "2143467890", now()); Query OK, 1 row affected (0.06 sec) mysql>Assuming everything went smoothly, let's see what we have so far. mysql> select * from myfriends; +----+------+-----------------------+------------+---------------------+ | id | name | address | phone | createdate | +----+------+-----------------------+------------+---------------------+ | 1 | Adam | 120 This Street | 5121234567 | 2023-03-20 16:40:25 | | 2 | Eve | 131 That Street | 5123456789 | 2023-03-20 16:40:53 | | 3 | Cain | 142 That Other Street | 2141234567 | 2023-03-20 16:41:18 | | 4 | Able | 153 Some Other Street | 2143467890 | 2023-03-20 16:41:47 | +----+------+-----------------------+------------+---------------------+ 4 rows in set (0.00 sec)So far so good, notice the associations between the fields (id, name, etc) and their new values ("1", "Adam", etc). Make sure you keep them in the right order. Note that you can use the up-arrow to see the last line entered, and can edit it in place. The 'createdate' field entries introduce the concept of mysql functions. In this example, the 'now()' function puts the exact time (to seconds) into the createdate field, one of the handier functions that is frequently used for keeping track of when records are created or modified. So how do we access the data? Let's get Adam's phone number mysql> select phone from myfriends where name='Adam'; +------------+ | phone | +------------+ | 5121234567 | +------------+ 1 row in set (0.00 sec)That's fine for one phone call, what if we want to get ALL the numbers mysql> select name, phone from myfriends; +------+------------+ | name | phone | +------+------------+ | Adam | 5121234567 | | Eve | 5123456789 | | Cain | 2141234567 | | Able | 2143467890 | +------+------------+ 4 rows in set (0.00 sec)To complete the most basic database actions, let's assume Cain has done some things we can no longer put up with, so we no longer need his information. mysql> delete from myfriends where name='Cain'; Query OK, 1 row affected (0.04 sec) mysql> select name, phone from myfriends; +------+------------+ | name | phone | +------+------------+ | Adam | 5121234567 | | Eve | 5123456789 | | Able | 2143467890 | +------+------------+ 3 rows in set (0.00 sec)And in the remote chance we want to start a new life we can delete the entire table structure to start over from scratch. mysql> drop table myfriends; Query OK, 0 rows affected (0.15 sec) mysql> exit; Scripting Database Operations
Entering all these lines manually is tedious at best, and likely errorprone. There's got to be a better way. What if we could type all the data into a text file and tell the mysql program to read it as if we're entering everything by hand? Well, in the command line linux world that's called "redirection", or specifically in this case "input redirection". First we'll create a file containing all the right commands:
[root@localhost ~]# edit addressbook-myfriends-20230504-setup.sql use addressbook; DROP TABLE IF EXISTS myfriends; create table myfriends( id int, name varchar(50), address varchar(150), phone char(10), crdate timestamp, primary key (id) ); insert into myfriends(id, name, address, phone, crdate) values ("1","Alpha","One Main Street","1234567890", now()); insert into myfriends(id, name, address, phone, crdate) values ("2","Bravo","Two Main Street","2345678901", now()); insert into myfriends(id, name, address, phone, crdate) values ("3","Charlie","One Main Street","3456789012", now()); insert into myfriends(id, name, address, phone, crdate) values ("4","Delta","Three Main Street","4567890123", now()); insert into myfriends(id, name, address, phone, crdate) values ("5","Echo","402 Main Street","5678901234", now()); insert into myfriends(id, name, address, phone, crdate) values ("6","Frito","157 Riverside Avenue","6789012345", now()); insert into myfriends(id, name, address, phone, crdate) values ("7","Gandalf","1200 Pennsylvania Avenue","7890123456", now());Note the new command string => DROP TABLE IF EXISTS. That is very useful for repetitively creating the same table but is very dangerous if used inappropriately. To DROP the table means delete it completely. There is no "Are you Sure", and there is no undo. The DROP command also works for the addressbook DATABASE and for USERS with the same caveats. Anyway, now that the file is created, let's "redirect" the mysql command input from our new file. [root@localhost ~]# mysql -u root -p < addressbook-myfriends-20230504-setup.sql Enter password: M7newPa55_word [root@localhost ~]#Just like that you have deleted the old table if it exists, created the table again, and populated it with 7 new entries. Exercise: If you're building along, go back into mysql manually and make sure the data is there. Personal best practice - I always name my sql input / rebuild / backup files like the recommendation above, with the database and table (if only one) names, along with a datecode like YYYYMMDD, and the suffix 'sql'. This makes it wasy to find the right file when searching and reminds me of the databases used when my memory has a transient. If there are multiple tables within a database I leave off the '-tablename' portion of the name and make sure ALL relevant tables are in the file! Adding Users and Setting Permission
It's never a good idea to do all your work as root, the system superuser who essentially has the elevated system privileges needed to write over or delete literally anything in the system. The same logic applies within the mysql server software. So it's good practice to set up an administrator or even a minimum privilege use for each database. That can prevent disaster by compartmentalizing mistakes. If we create a user named addressbookadmin and limit its privileges only to the addressbook, addressbookadmin can not impact any other databases.
Start reading about accounts and passwords here Let's configure addressbookadmin as the offical administrator on our addressbook database and give the account (but only from localhost) all privileges to make sure it works.[root@localhost ~]# mysql -u root -p Enter password: M7newPa55_word Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 22 Server version: 8.0.30 Source distribution Copyright (c) 2000, 2022, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> use addressbook; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> CREATE USER 'addressbookadmin'@'localhost' IDENTIFIED BY 'adbkadmPWD2_3'; Query OK, 0 rows affected (0.05 sec) mysql> GRANT ALL ON addressbook.* to 'addressbookadmin'@'localhost' WITH GRANT OPTION; Query OK, 0 rows affected (0.06 sec) mysql>Now addressbookadmin can administer the addressbook database and all of the tables inside (addressbook.* in the GRANT command) without any impact on any other database. From the command line, logging in as the new user to use the addressbook database would look like this: [root@localhosts ~]# mysql -u addressbookadmin -p addressbook Enter password: Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 24 Server version: 8.0.30 Source distribution Copyright (c) 2000, 2022, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show databases; +--------------------+ | Database | +--------------------+ | addressbook | | information_schema | | performance_schema | +--------------------+ 3 rows in set (0.00 sec)Note that the mysql and sys databases are missing compared to those seen by the root account. mysql> use addressbook; Database changed mysql> select * from myfriends; +----+---------+--------------------------+------------+---------------------+ | id | name | address | phone | crdate | +----+---------+--------------------------+------------+---------------------+ | 1 | Alpha | One Main Street | 1234567890 | 2023-03-22 15:32:06 | | 2 | Bravo | Two Main Street | 2345678901 | 2023-03-22 15:32:06 | | 3 | Charlie | One Main Street | 3456789012 | 2023-03-22 15:32:06 | | 4 | Delta | Three Main Street | 4567890123 | 2023-03-22 15:32:06 | | 5 | Echo | 402 Main Street | 5678901234 | 2023-03-22 15:32:06 | | 6 | Frito | 157 Riverside Avenue | 6789012345 | 2023-03-22 15:32:06 | | 7 | Gandalf | 1200 Pennsylvania Avenue | 7890123456 | 2023-03-22 15:32:06 | +----+---------+--------------------------+------------+---------------------+ 7 rows in set (0.00 sec) mysql> exit; Bye Backup and Restore, or Moving to a New Server
mysqldump — A Database Backup Program
[root@localhost ~]# mysqldump -p addressbook > addressbook-setup.sql Enter password: [root@t5500 ~]# cat addressbook-setup.sql -- MySQL dump 10.13 Distrib 8.0.30, for Linux (x86_64) -- -- Host: localhost Database: addressbook -- ------------------------------------------------------ -- Server version 8.0.30 /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!50503 SET NAMES utf8mb4 */; /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; /*!40103 SET TIME_ZONE='+00:00' */; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; -- -- Table structure for table `myfriends` -- DROP TABLE IF EXISTS `myfriends`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `myfriends` ( `id` int NOT NULL, `name` varchar(50) DEFAULT NULL, `address` varchar(150) DEFAULT NULL, `phone` char(10) DEFAULT NULL, `crdate` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; /*!40101 SET character_set_client = @saved_cs_client */; -- -- Dumping data for table `myfriends` -- LOCK TABLES `myfriends` WRITE; /*!40000 ALTER TABLE `myfriends` DISABLE KEYS */; INSERT INTO `myfriends` VALUES (1,'Alpha','One Main Street','1234567890','2023-03-22 15:32:06'), (2,'Bravo','Two Main Street','2345678901','2023-03-22 15:32:06'), (3,'Charlie','One Main Street','3456789012','2023-03-22 15:32:06'), (4,'Delta','Three Main Street','4567890123','2023-03-22 15:32:06'), (5,'Echo','402 Main Street','5678901234','2023-03-22 15:32:06'), (6,'Frito','157 Riverside Avenue','6789012345','2023-03-22 15:32:06'), (7,'Gandalf','1200 Pensylvania Avenue','7890123456','2023-03-22 15:32:06'); /*!40000 ALTER TABLE `myfriends` ENABLE KEYS */; UNLOCK TABLES; /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; /*!40101 SET SQL_MODE=@OLD_SQL_MODE */; /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; -- Dump completed on 2023-03-22 10:33:14Notice the similarity to the "*-setup.sql" file we created earlier? This backup file is designed to be able to use as a similar input to restore or move the database to another system. Bonus Material for Database and Server Administrators
Username Generator
Secure Password Generator Pro-Tip: Make sure you save the outputs to a file, like the .sql files above. Chmod/Chown 600 root.root... |
|
||||||||||||||||||||||||||||||||||||||||||||||
all original content ©1994-2025 Yes, that means 30+ years on the web An exercise in truly free free-speech. No license required, no training wheels available. "When words lose their meaning, people will lose their liberty." -- Confucius vincit omnia veritas |