MySQL database en gebruiker maken met één commando

Status
Niet open voor verdere reacties.

mariannevanh

Terugkerende gebruiker
Lid geworden
14 dec 2004
Berichten
2.119
Voor het maken van een database gebruik ik meestal het standaardcommando:
Code:
mysql -u root -p

Na het invoeren van het wachtwoord geef ik bij de MySQL-prompt de volgende commando's:

Code:
CREATE DATABASE testdatabase;
CREATE USER 'testgebruiker'@'localhost' IDENTIFIED BY 'testwachtwoord';
GRANT ALL PRIVILEGES ON testdatabase.* TO 'testgebruiker'@'localhost';
FLUSH PRIVILEGES;

Nu ben ik op zoek naar een mogelijkheid om een dergelijke database te maken met (bij voorkeur) één commando.
Is dit mogelijk en zo ja, hoe?

Vriendelijke groet,
Guido
 
Kan je deze commando's niet verpakken in een PHP-script of een bash-script (linux)?

Trouwens, werken als root, en nog zonder password? Eh....
 
Laatst bewerkt:
Trouwens, werken als root, en nog zonder password? Eh....

TS geeft toch een wachtwoord in? Of zie ik wat over het hoofd ....:rolleyes:

Maar om terug te komen op het 'probleem' ..... je wilt 2 dingen doen (database en gebruiker aanmaken), ik denk dat je dan ook 2 commando's moet gebruiken .... :)

Of zoals PHP4U al aangaf, maak er een functie in PHP van en roep deze aan.
 
Ah, toch wel een password. Normaal staat die achter de -p.

Maar om dit in een script te zetten, is het erg handig.Het gaat immers om enkele verschillende procedures.
 
Maar gelukkig kijk je nu naar een forum, dus..... ;)

...wie kan mij helpen aan een voorbeeld-script om een MySQL-database te maken?

Ik ben bezig met het bouwen van een Nextcloud-server. Mijn lijstje met te geven commando's zou ik graag in een script willen verpakken, maar hoe doe ik dat?
 
Ik zet niet voor 100% procent erin dat PHP kan werken, maar het valt te proberen met mysqli_query() functies....

Ik denk dat een bash-script het beste is, en dat verschilt niet gek veel van de commando's je al al afvuurt in de commandline.
Ik neem even aan dat je Linux gebruikt?

Ik zou zeggen, probeer eens wat, en laat eens zien wat je hebt en tot hoever je al bent gekomen?
 
Mijn voorlopige script ziet er als volgt uit:

Code:
sudo su

apt-get -y update && apt-get -y upgrade

apt-get -y install apache2 php7.2 bzip2 libapache2-mod-php php-gd php-json php-mysql php-curl php-mbstring php-intl php-imagick php-xml php-zip mysql-server php-mysql net-tools locate software-properties-common python-certbot-apache unzip putty-tools

mysql -u root -p

	CREATE DATABASE testdatabase;
	CREATE USER 'testuser'@'localhost' IDENTIFIED BY 'testwachtwoord';
	GRANT ALL PRIVILEGES ON testdatabase.* TO 'testuser'@'localhost';
	FLUSH PRIVILEGES;

mkdir /media/usb
mount -t vfat /dev/sdb1 /media/usb -o uid=1000,gid=1000,utf8,dmask=027,fmask=137
cd /var/www
wget https://download.nextcloud.com/server/releases/nextcloud-17.0.1.tar.bz2 -O nextcloud-17-latest.tar.bz2
tar -xvjf nextcloud-17-latest.tar.bz2
rm -rf html
mv nextcloud html
chown -R www-data:www-data html
rm nextcloud-17-latest.tar.bz2
nano /etc/apache2/sites-available/nextcloud.conf

	<VirtualHost *:80>
	  ServerName YOURDOMAIN.TLD
	  ServerAdmin YOUR@EMAIL.TLD
	  DocumentRoot /var/www/nextcloud

	Alias /nextcloud "/var/www/html/"
	<Directory /var/www/html/>
	  Options FollowSymLinks MultiViews
	  AllowOverride All
	 <IfModule mod_dav.c>
	  Dav off
	 </IfModule>
	 SetEnv HOME /var/www/html
	 SetEnv HTTP_HOME /var/www/html
	</Directory>
    Require all granted
    AllowOverride All
</VirtualHost>

a2ensite nextcloud
a2enmod rewrite headers
sed -i '/^memory_limit =/s/=.*/= 512M/' /etc/php/7.2/apache2/php.ini
ufw allow http
ufw allow https
systemctl restart apache2
ufw allow https
systemctl restart apache2

mkdir /var/nextcloud_data
chown www-data:www-data /var/nextcloud_data
chmod 755 /var/nextcloud_data
cd /var/nextcloud_data

browse to IP address and create admin account

apt-get install -y redis-server php-redis 

systemctl restart apache2

cat /etc/php/7.2/apache2/conf.d/10-opcache.ini /media/usb/home/guido/opcache.cfg > /etc/php/7.2/apache2/conf.d/10-opcache-1.ini
rm /etc/php/7.2/apache2/conf.d/10-opcache.ini
mv /etc/php/7.2/apache2/conf.d/10-opcache-1.ini /etc/php/7.2/apache2/conf.d/10-opcache.ini
sed -i 's/);//g' /var/www/html/config/config.php
cat /var/www/html/config/config.php /media/usb/home/guido/memcache.cfg > /var/www/html/config/config1.php
rm /var/www/html/config/config.php
mv /var/www/html/config/config1.php /var/www/html/config/config.php
chown www-data:www-data /var/www/html/config/config.php

systemctl restart apache2

sudo -u www-data php /var/www/html/occ config:system:set trusted_domains 2 --value=mijndomein.nl

systemctl restart apache2
apt-get update
add-apt-repository ppa:certbot/certbot

apt install -y certbot

apt-get -y update
certbot --apache

systemctl restart apache2
apt-get -y update && apt-get -y upgrade

apt -y autoremove

cd /home/guido
git clone https://github.com/andreafabrizi/Dropbox-Uploader.git
git clone https://github.com/DecaTec/Nextcloud-Backup-Restore.git

mkdir -p /var/nextcloud_backup
mkdir /home/guido/Dropbox-Uploader

unzip /media/usb/home/guido/Dropbox-Uploader-master.zip
mv Dropbox-Uploader-master/ Dropbox-Uploader
cd Dropbox-Uploader
./dropbox_uploader.sh

mkdir -p /mnt/Share/NextcloudBackups

chmod +x Nextcloud*.sh
crontab -e

0 4 * * * /home/guido/Nextcloud-Backup-Restore/NextcloudBackup.sh

De tekst op regel 58 is geen commando aan de computer, maar een opdracht aan mij...
De tekst YOURDOMAIN e.d. zijn uiteraard in mijn situatie anders.
 
Dat script doet meer dan jij wilt. Ik neem aan dat je begrijpt wat alles doet?
 
Dat script doet meer dan jij wilt. Ik neem aan dat je begrijpt wat alles doet?

Ja, na het doorlopen van dit script heb ik een in de basis goed opgezette Nextcloud.
Ja, niet dat alles tot in de diepste krochten van elk commando ken, maar ik kan elk commando verklaren.

Met het anonimiseren van mijn "script" is wel wat fout gegaan. Zo is de regels 50 en 51 per ongeluk dubbel geplaatst, maar dat zijn peanuts.

Ik noem dit voor de gein wel eens een HR-script: Human Readable omdat deze reeks commando's niet in deze vorm kunnen worden verpakt tot één uitvoerbaar bestand voor Ubuntu. En dat laatste is dus juist wat ik zou willen. Wie kan mij daarbij helpen?
 
Maak er een bash-script van, en geef die uitvoerende rechten.
 
Misschien moet je even terugkijken in je 'script'?
En anders is dit niet zo heel lastig te vinden :P
 
Vanaf de commandline doe je dat met -e waar je het statement achter zet:
Code:
mysql -u root -p -e "CREATE DATABASE test"

Wel wordt dan iedere keer om een wachtwoord gevraagd, dat zou je ook één keer aan het begin kunnen doen en in een variabele zetten. Bijvoorbeeld aan het begin van je script zet je dit:
Code:
echo -n "Geef database gebruikersnaam in: "
read DB_USER
echo -n "Geef database wachtwoord in: "
read -s DB_PASS
echo
Let op de -s voor DB_PASS, dat is om er voor te zorgen dat bij het ingeven van het wachtwoord deze niet op je scherm getoond wordt. Daarna komt het commando om een statement uit te voeren er zo uit te zien:
Code:
mysql -u $DB_USER -p$DB_PASS -e "CREATE DATABASE test"
 
Volgens mij kom ik hiermee wel uit de voeten.

Wat moet ik doen als ik nu nog twee extra commando's wil geven:
Code:
GRANT ALL PRIVILEGES ON test.* TO 'YYYY'@'localhost';
FLUSH PRIVILEGES;

Ik probeerde het al met
Code:
mysql -u $DB_USER -p$DB_PASS -e "CREATE DATABASE test" GRANT ALL PRIVILEGES ON test.* TO $DB_USER@'localhost' FLUSH PRIVILEGES
maar kom er nog niet uit.
 
Je kunt een regel toevoegen voor ieder statement zoals dit:

Code:
mysql -u $DB_USER -p$DB_PASS -e "CREATE DATABASE test" 
mysql -u $DB_USER -p$DB_PASS -e "GRANT ALL PRIVILEGES ON test.* TO $DB_USER@'localhost'"
mysql -u $DB_USER -p$DB_PASS -e "FLUSH PRIVILEGES"

Maar als je het op één regel wilt hebben moet het volgens mij ook zo kunnen:

Code:
mysql -u $DB_USER -p$DB_PASS -e "CREATE DATABASE test;GRANT ALL PRIVILEGES ON test.* TO $DB_USER@'localhost';FLUSH PRIVILEGES;"

Dus ieder statement afsluiten met een puntkomma, en alle statements tussen de dubbele quotes.
 
Dankjewel.
Op basis van deze aanwijzingen, maakte ik dit (deel)script:
Code:
#!/bin/bash
echo -n "Geef naam database in: "
read DB
echo -n "Geef database gebruikersnaam in: "
read DB_USER
echo -n "Geef database wachtwoord in: "
read -s DB_PASS
mysql -u $DB_USER -p$DB_PASS -e "CREATE DATABASE $DB;GRANT ALL PRIVILEGES ON $DB.* TO $DB_USER@'localhost';FLUSH PRIVILEGES;quit"

De drie inputvragen worden netjes gesteld en daar geef ik een antwoord op. Daarna krijg ik een foutmelding:
ERROR 1045 (28000): Access denied for user 'db2user'@'localhost' (using password: YES)
 
Het account waar je rechten aan uitdeelt en het account waarmee je dat doet zijn verschillende accounts. Gebruikersnaam en wachtwoord dat je invult bij DB_USER en DB_PASS zijn de gegevens van het root account, deze is namelijk geautoriseerd om rechten uit te delen. Het account db2user is dat niet. Daar kun je een extra variabele voor maken, dan krijg je zoiets:

Code:
#!/bin/bash
echo -n "Geef naam database in: "
read DB
echo -n "Geef database gebruikersnaam in: "
read DB_USER
echo -n "Geef database wachtwoord in: "
read -s DB_PASS
echo -n "Geef gebruikersnaam in welke toegang moet krijgen tot de nieuwe database: "
read DB_USER_GRANT
mysql -u $DB_USER -p$DB_PASS -e "CREATE DATABASE $DB;GRANT ALL PRIVILEGES ON $DB.* TO $DB_USER_GRANT@'localhost';FLUSH PRIVILEGES;quit"
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan