{"id":49209,"date":"2025-04-29T06:19:10","date_gmt":"2025-04-29T06:19:10","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=49209"},"modified":"2025-04-29T06:19:10","modified_gmt":"2025-04-29T06:19:10","slug":"managing-mariadb-root-password-and-connection-behavior-in-xampp-ubuntu","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/managing-mariadb-root-password-and-connection-behavior-in-xampp-ubuntu\/","title":{"rendered":"Managing MariaDB Root Password and Connection Behavior in XAMPP (Ubuntu)"},"content":{"rendered":"\n<h1 class=\"wp-block-heading\"><\/h1>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">\u2601\ufe0f Introduction<\/h1>\n\n\n\n<p>When working with <strong>MariaDB\/MySQL<\/strong> inside <strong>XAMPP<\/strong> on <strong>Ubuntu<\/strong>, many developers face confusing issues related to <strong>root password behavior<\/strong>, <strong>localhost vs 127.0.0.1 access<\/strong>, and <strong>authentication plugins<\/strong>.<br>This tutorial provides a <strong>comprehensive step-by-step guide<\/strong> to understand, troubleshoot, and secure your MariaDB setup.<\/p>\n\n\n\n<p>\u2705 Learn why <strong>password prompts behave differently<\/strong>,<br>\u2705 How to <strong>fix broken authentication<\/strong> (even after using <code>--skip-grant-tables<\/code>),<br>\u2705 And how to <strong>set up proper security best practices<\/strong> for production or local development.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">\ud83d\uded1 Problem: Different Behavior Between <code>localhost<\/code> and <code>127.0.0.1<\/code><\/h1>\n\n\n\n<p>You may notice:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>When connecting via <code>localhost<\/code>, MariaDB allows login <strong>without password<\/strong>.<\/li>\n\n\n\n<li>When connecting via <code>127.0.0.1<\/code>, it <strong>asks for root password<\/strong>.<\/li>\n<\/ul>\n\n\n\n<p>\u2705 This is <strong>not a bug<\/strong> \u2014 it&#8217;s due to <strong>different connection methods<\/strong>.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Connection Type<\/th><th>Behavior<\/th><\/tr><\/thead><tbody><tr><td><code>localhost<\/code><\/td><td>Connects via <strong>Unix Socket<\/strong> (auth_socket plugin)<\/td><\/tr><tr><td><code>127.0.0.1<\/code><\/td><td>Connects via <strong>TCP\/IP<\/strong> (password-based plugin)<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>In MariaDB, different <strong>plugins<\/strong> can authenticate based on how you connect.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">\ud83d\udd0d How to Check Current User Authentication Plugins<\/h1>\n\n\n\n<p>Login to MariaDB (even without password if allowed):<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">sudo mysql -u root\n<\/code><\/span><\/pre>\n\n\n<p>Run:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">SELECT<\/span> <span class=\"hljs-selector-tag\">user<\/span>, <span class=\"hljs-selector-tag\">host<\/span>, <span class=\"hljs-selector-tag\">plugin<\/span> <span class=\"hljs-selector-tag\">FROM<\/span> <span class=\"hljs-selector-tag\">mysql<\/span><span class=\"hljs-selector-class\">.user<\/span>;\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Typical result:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>user<\/th><th>host<\/th><th>plugin<\/th><\/tr><\/thead><tbody><tr><td>root<\/td><td>localhost<\/td><td>auth_socket<\/td><\/tr><tr><td>root<\/td><td>127.0.0.1<\/td><td>mysql_native_password<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">\ud83d\udee0 How to Fix: Make Root Always Require Password<\/h1>\n\n\n\n<p>By default, in Ubuntu XAMPP, <code>root@localhost<\/code> may use <code>auth_socket<\/code>, meaning <strong>system login<\/strong>, not <strong>password login<\/strong>.<br>To fix and <strong>enforce password login<\/strong>, change the authentication plugin.<\/p>\n\n\n\n<p>\u2705 Correct command for <strong>MariaDB<\/strong>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">ALTER USER <span class=\"hljs-string\">'root'<\/span>@<span class=\"hljs-string\">'localhost'<\/span> IDENTIFIED BY <span class=\"hljs-string\">'yourStrongPassword'<\/span>;\nFLUSH PRIVILEGES;\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>\u2705 After that:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Connecting via <code>localhost<\/code> or <code>127.0.0.1<\/code> both require <strong>password<\/strong>.<\/li>\n\n\n\n<li>No automatic system user trust.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">\ud83d\udee0 What If You See <code>--skip-grant-tables<\/code> Error?<\/h1>\n\n\n\n<p>If you get:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">ERROR <span class=\"hljs-number\">1290<\/span> (HY000): The MariaDB server is running <span class=\"hljs-keyword\">with<\/span> the --skip-grant-tables option\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>It means:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Grant tables are disabled<\/strong>,<\/li>\n\n\n\n<li>You <strong>cannot ALTER USER or SET PASSWORD<\/strong>.<\/li>\n<\/ul>\n\n\n\n<p>\u2705 Solution:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Stop MariaDB<\/strong>:<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">sudo \/opt\/lampp\/lampp stopmysql\n<\/code><\/span><\/pre>\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>Start MariaDB normally<\/strong>:<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">sudo \/opt\/lampp\/lampp startmysql\n<\/code><\/span><\/pre>\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>Then login and fix password<\/strong> properly.<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">\ud83d\udce6 How to Check and Remove Permanent <code>--skip-grant-tables<\/code><\/h1>\n\n\n\n<p>Sometimes, <code>--skip-grant-tables<\/code> is accidentally set in XAMPP\u2019s MariaDB configuration.<\/p>\n\n\n\n<p>Check file:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">sudo nano \/opt\/lampp\/etc\/my.cnf\n<\/code><\/span><\/pre>\n\n\n<p>Look for:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">skip-grant-tables\n<\/code><\/span><\/pre>\n\n\n<p>\u2705 If found, <strong>comment it out<\/strong>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-id\">#skip-grant-tables<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>\u2705 Then restart MariaDB.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">\ud83d\udd25 Best Practices to Secure MariaDB on Ubuntu (especially inside XAMPP)<\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Practice<\/th><th>Why It Matters<\/th><\/tr><\/thead><tbody><tr><td>Always set a strong password for root<\/td><td>Prevent unauthorized access<\/td><\/tr><tr><td>Disable root remote login<\/td><td><code>root<\/code> should only login from <code>localhost<\/code><\/td><\/tr><tr><td>Create a new admin user<\/td><td>Use <code>adminuser@localhost<\/code> for your apps instead of root<\/td><\/tr><tr><td>Keep your MariaDB updated<\/td><td>Get latest security patches<\/td><\/tr><tr><td>Secure XAMPP itself<\/td><td>Password-protect XAMPP dashboard and phpMyAdmin<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">\ud83d\udee0 How to Create a New Admin User (Recommended)<\/h1>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Login:<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">mysql -u root -p\n<\/code><\/span><\/pre>\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>Run:<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">CREATE USER <span class=\"hljs-string\">'adminuser'<\/span>@<span class=\"hljs-string\">'localhost'<\/span> IDENTIFIED BY <span class=\"hljs-string\">'yourSecurePassword123!'<\/span>;\nGRANT ALL PRIVILEGES ON *.* TO <span class=\"hljs-string\">'adminuser'<\/span>@<span class=\"hljs-string\">'localhost'<\/span> WITH GRANT OPTION;\nFLUSH PRIVILEGES;\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>\u2705 Now you can use <code>adminuser<\/code> safely for all database operations.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">\ud83d\udccb Summary Checklist<\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Action<\/th><th>Done?<\/th><\/tr><\/thead><tbody><tr><td>Fix root password with <code>ALTER USER<\/code><\/td><td>\u2705<\/td><\/tr><tr><td>Restart MariaDB without <code>--skip-grant-tables<\/code><\/td><td>\u2705<\/td><\/tr><tr><td>Remove <code>skip-grant-tables<\/code> from <code>my.cnf<\/code><\/td><td>\u2705<\/td><\/tr><tr><td>Disable root remote access (optional)<\/td><td>\u2705<\/td><\/tr><tr><td>Create separate admin user for apps<\/td><td>\u2705<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">\ud83d\ude80 Final Notes<\/h1>\n\n\n\n<ul class=\"wp-block-list\">\n<li>When using MariaDB with XAMPP in Ubuntu, always verify <strong>connection method differences<\/strong> (<code>localhost<\/code> vs <code>127.0.0.1<\/code>).<\/li>\n\n\n\n<li>Ensure MariaDB server runs <strong>without &#8211;skip-grant-tables<\/strong> for full security.<\/li>\n\n\n\n<li><strong>Don&#8217;t use <code>root<\/code> for web apps<\/strong> \u2014 create a limited user.<\/li>\n\n\n\n<li>Always <strong>restart XAMPP cleanly<\/strong> after major database config changes.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">\ud83e\udde0 Pro Tip<\/h1>\n\n\n\n<p>If you\u2019re planning to expose XAMPP or MariaDB over the internet (even in test environments):<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Enable SSL\/TLS for MySQL connections.<\/li>\n\n\n\n<li>Use firewall rules to restrict IP access.<\/li>\n\n\n\n<li>Prefer SSH tunnels for remote database connections instead of direct port opening.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">\ud83d\udce2 Conclusion<\/h1>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>&#8220;A secure database setup begins with understanding the basics: authentication, connection types, and privilege management.&#8221;<\/p>\n<\/blockquote>\n\n\n\n<p>Following the steps in this tutorial will ensure you have a <strong>properly secured and consistent MariaDB environment inside XAMPP<\/strong>, ready for both development and production testing.<\/p>\n\n\n\n<p>Stay secure. Happy coding! \ud83d\ude80<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">\u2705 Ready-To-Use Final Command Set (Summary)<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">sudo \/opt\/lampp\/lampp stopmysql\nsudo nano \/opt\/lampp\/etc\/my.cnf   <span class=\"hljs-comment\"># Comment out skip-grant-tables if exists<\/span>\nsudo \/opt\/lampp\/lampp startmysql\n\nmysql -u root -p\n\nALTER USER <span class=\"hljs-string\">'root'<\/span>@<span class=\"hljs-string\">'localhost'<\/span> IDENTIFIED BY <span class=\"hljs-string\">'YourStrongPassword!'<\/span>;\nFLUSH PRIVILEGES;\n\nCREATE USER <span class=\"hljs-string\">'adminuser'<\/span>@<span class=\"hljs-string\">'localhost'<\/span> IDENTIFIED BY <span class=\"hljs-string\">'yourSecurePassword123!'<\/span>;\nGRANT ALL PRIVILEGES ON *.* TO <span class=\"hljs-string\">'adminuser'<\/span>@<span class=\"hljs-string\">'localhost'<\/span> WITH GRANT OPTION;\nFLUSH PRIVILEGES;\n<span class=\"hljs-keyword\">EXIT<\/span>;\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>\u2705 Done!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u2601\ufe0f Introduction When working with MariaDB\/MySQL inside XAMPP on Ubuntu, many developers face confusing issues related to root password behavior, localhost vs 127.0.0.1 access, and authentication plugins.This tutorial provides a&#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[2],"tags":[],"class_list":["post-49209","post","type-post","status-publish","format-standard","hentry","category-uncategorised"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/49209","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=49209"}],"version-history":[{"count":1,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/49209\/revisions"}],"predecessor-version":[{"id":49210,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/49209\/revisions\/49210"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=49209"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=49209"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=49209"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}