4 \chapter{Installing and Configuring PostgreSQL}
5 \label{PostgreSqlChapter}
6 \index[general]{PostgreSQL!Installing and Configuring }
7 \index[general]{Installing and Configuring PostgreSQL }
8 \index[general]{Upgrading}
10 If you are considering using PostreSQL, you should be aware
11 of their philosophy of upgrades, which could be
12 destabilizing for a production shop. Basically at every major version
13 upgrade, you are required to dump your database in an ASCII format,
14 do the upgrade, and then reload your database (or databases). This is
15 because they frequently update the "data format" from version to
16 version, and they supply no tools to automatically do the conversion.
17 If you forget to do the ASCII dump, your database may become totally
18 useless because none of the new tools can access it due to the format
19 change, and the PostgreSQL server will not be able to start.
21 If you are building PostgreSQL from source, please be sure to add
22 the {\bf \verb:--:enable-thread-safety} option when doing the ./configure
25 \section{Installing PostgreSQL}
26 \index[general]{PostgreSQL!Installing }
28 If you use the {\bf ./configure \verb:--:with-postgresql=PostgreSQL-Directory}
29 statement for configuring {\bf Bacula}, you will need PostgreSQL version 7.4
30 or later installed. NOTE! PostgreSQL versions earlier than 7.4 do not work
31 with Bacula. If PostgreSQL is installed in the standard system location, you
32 need only enter {\bf \verb:--:with-postgresql} since the configure program will
33 search all the standard locations. If you install PostgreSQL in your home
34 directory or some other non-standard directory, you will need to provide the
35 full path with the {\bf \verb:--:with-postgresql} option.
37 Installing and configuring PostgreSQL is not difficult but can be confusing
38 the first time. If you prefer, you may want to use a package provided by your
39 chosen operating system. Binary packages are available on most PostgreSQL
42 If you prefer to install from source, we recommend following the instructions
44 \elink{PostgreSQL documentation}{http://www.postgresql.org/docs/}.
46 If you are using FreeBSD,
47 \elink{this FreeBSD Diary article}{http://www.freebsddiary.org/postgresql.php}
48 will be useful. Even if you are not using FreeBSD, the article will contain
49 useful configuration and setup information.
51 If you configure the Batch Insert code in Bacula (attribute inserts are
52 10 times faster), you {\bf must} be using a PostgreSQL that was built with
53 the {\bf \verb:--:enable-thread-safety} option, otherwise you will get
54 data corruption. Most major Linux distros have thread safety turned on, but
55 it is better to check. One way is to see if the PostgreSQL library that
56 Bacula will be linked against references pthreads. This can be done
57 with a command such as:
61 nm /usr/lib/libpq.a | grep pthread_mutex_lock
65 The above command should print a line that looks like:
73 if does, then everything is OK. If it prints nothing, do not enable batch
74 inserts when building Bacula.
76 After installing PostgreSQL, you should return to completing the installation
77 of {\bf Bacula}. Later, after Bacula is installed, come back to this chapter
78 to complete the installation. Please note, the installation files used in the
79 second phase of the PostgreSQL installation are created during the Bacula
80 Installation. You must still come back to complete the second phase of the
81 PostgreSQL installation even if you installed binaries (e.g. rpm, deb,
85 \label{PostgreSQL_configure}
86 \section{Configuring PostgreSQL}
87 \index[general]{PostgreSQL!Configuring PostgreSQL -- }
89 At this point, you should have built and installed PostgreSQL, or already have
90 a running PostgreSQL, and you should have configured, built and installed {\bf
91 Bacula}. If not, please complete these items before proceeding.
93 Please note that the {\bf ./configure} used to build {\bf Bacula} will need to
94 include {\bf \verb:--:with-postgresql=PostgreSQL-directory}, where {\bf
95 PostgreSQL-directory} is the directory name that you specified on the
96 ./configure command for configuring PostgreSQL (if you didn't specify a
97 directory or PostgreSQL is installed in a default location, you do not need to
98 specify the directory). This is needed so that Bacula can find the necessary
99 include headers and library files for interfacing to PostgreSQL.
101 An important thing to note here is that {\bf Bacula} makes two connections
102 to the PostgreSQL server for each backup job that is currently running. If
103 you are intending to run a large number of concurrent jobs, check the value
104 of {\bf max\_connections} in your PostgreSQL configuration file to ensure
105 that it is larger than two times the setting {\bf Maximum Concurrent Jobs}
106 in your director configuration. {\bf Setting this too low will result in
107 some backup jobs failing to run correctly!}
109 {\bf Bacula} will install scripts for manipulating the database (create,
110 delete, make tables etc) into the main installation directory. These files
111 will be of the form *\_bacula\_* (e.g. create\_bacula\_database). These files
112 are also available in the \lt{}bacula-src\gt{}/src/cats directory after
113 running ./configure. If you inspect create\_bacula\_database, you will see
114 that it calls create\_postgresql\_database. The *\_bacula\_* files are
115 provided for convenience. It doesn't matter what database you have chosen;
116 create\_bacula\_database will always create your database.
118 Now you will create the Bacula PostgreSQL database and the tables that Bacula
119 uses. These instructions assume that you already have PostgreSQL running. You
120 will need to perform these steps as a user that is able to create new
121 databases. This can be the PostgreSQL user (on most systems, this is the pgsql
125 \item cd \lt{}install-directory\gt{}
127 This directory contains the Bacula catalog interface routines.
129 \item ./create\_bacula\_database
131 This script creates the PostgreSQL {\bf bacula} database.
132 Before running this command, you should carefully think about
133 what encoding sequence you want for the text fields (paths, files, ...).
134 Ideally, the encoding should be set to UTF8. However, many Unix systems
135 have filenames that are not encoded in UTF8, either because you have
136 not set UTF8 as your default character set or because you have imported
137 files from elsewhere (e.g. MacOS X). For this reason, Bacula uses
138 SQL\_ASCII as the default encoding. If you want to change this,
139 please modify the script before running it, but be forewarned that
140 Bacula backups will fail if PostgreSQL finds any non-UTF8 sequences.
142 If running the script fails, it is probably because the database is
143 owned by a user other than yourself. On many systems, the database
144 owner is {\bf pgsql} and on others such as Red Hat and Fedora it is {\bf
145 postgres}. You can find out which it is by examining your /etc/passwd
146 file. To create a new user under either your name or with say the name
147 {\bf bacula}, you can do the following:
151 (enter root password)
152 su pgsql (or postgres)
153 createuser kern (or perhaps bacula)
154 Shall the new user be allowed to create databases? (y/n) y
155 Shall the new user be allowed to create more new users? (y/n) (choose
160 At this point, you should be able to execute the
161 ./create\_bacula\_database command.
163 \item ./make\_bacula\_tables
165 This script creates the PostgreSQL tables used by {\bf Bacula}.
166 \item ./grant\_bacula\_privileges
168 This script creates the database user {\bf bacula} with restricted access
169 rights. You may want to modify it to suit your situation. Please note that
170 this database is not password protected.
174 Each of the three scripts (create\_bacula\_database, make\_bacula\_tables, and
175 grant\_bacula\_privileges) allows the addition of a command line argument.
176 This can be useful for specifying the user name. For example, you might need
177 to add {\bf -h hostname} to the command line to specify a remote database
180 To take a closer look at the access privileges that you have setup with the
185 PostgreSQL-directory/bin/psql --command \\dp bacula
189 Also, I had an authorization problem with the password. In the end,
190 I had to modify my {\bf pg\_hba.conf} file (in /var/lib/pgsql/data on my machine)
195 local all all ident sameuser
201 This solved the problem for me, but it is not always a good thing
202 to do from a security standpoint. However, it allowed me to run
203 my regression scripts without having a password.
205 A more secure way to perform database authentication is with md5
206 password hashes. Begin by editing the {\bf pg\_hba.conf} file, and
207 just prior the the existing ``local'' and ``host'' lines, add the line:
211 local bacula bacula md5
215 and restart the Postgres database server (frequently, this can be done
216 using "/etc/init.d/postgresql restart" or "service postgresql restart") to
217 put this new authentication rule into effect.
219 Next, become the Postgres administrator, postgres, either by logging
220 on as the postgres user, or by using su to become root and then using
221 su - postgres to become postgres. Add a password to the bacula
222 database for the bacula user using:
227 bacula=# alter user bacula with password 'secret';
233 You'll have to add this password to two locations in the
234 bacula-dir.conf file: once to the Catalog resource and once to the
235 RunBeforeJob entry in the BackupCatalog Job resource. With the
236 password in place, these two lines should look something like:
240 dbname = bacula; user = bacula; password = "secret"
242 # WARNING!!! Passing the password via the command line is insecure.
243 # see comments in make_catalog_backup for details.
244 RunBeforeJob = "/etc/make_catalog_backup bacula bacula secret"
248 Naturally, you should choose your own significantly more random
249 password, and ensure that the bacula-dir.conf file containing this
250 password is readable only by the root.
252 Even with the files containing the database password properly
253 restricted, there is still a security problem with this approach: on
254 some platforms, the environment variable that is used to supply the
255 password to Postgres is available to all users of the
256 local system. To eliminate this problem, the Postgres team have
257 deprecated the use of the environment variable password-passing
258 mechanism and recommend the use of a .pgpass file instead. To use
259 this mechanism, create a file named .pgpass containing the single
264 localhost:5432:bacula:bacula:secret
268 This file should be copied into the home directory of all accounts
269 that will need to gain access to the database: typically, root,
270 bacula, and any users who will make use of any of the console
271 programs. The files must then have the owner and group set to match
272 the user (so root:root for the copy in ~root, and so on), and the mode
273 set to 600, limiting access to the owner of the file.
275 \section{Re-initializing the Catalog Database}
276 \index[general]{Database!Re-initializing the Catalog }
277 \index[general]{Re-initializing the Catalog Database }
279 After you have done some initial testing with {\bf Bacula}, you will probably
280 want to re-initialize the catalog database and throw away all the test Jobs
281 that you ran. To do so, you can do the following:
285 cd <install-directory>
288 ./grant_bacula_privileges
292 Please note that all information in the database will be lost and you will be
293 starting from scratch. If you have written on any Volumes, you must write an
294 end of file mark on the volume so that Bacula can reuse it. Do so with:
298 (stop Bacula or unmount the drive)
299 mt -f /dev/nst0 rewind
304 Where you should replace {\bf /dev/nst0} with the appropriate tape drive
305 device name for your machine.
307 \section{Installing PostgreSQL from RPMs}
308 \index[general]{PostgreSQL!Installing from RPMs}
309 \index[general]{Installing PostgreSQL from RPMs}
310 If you are installing PostgreSQL from RPMs, you will need to install
311 both the PostgreSQL binaries and the client libraries. The client
312 libraries are usually found in a devel package, so you must
324 These will be similar with most other package managers too. After
325 installing from rpms, you will still need to run the scripts that set up
326 the database and create the tables as described above.
329 \section{Converting from MySQL to PostgreSQL}
330 \index[general]{PostgreSQL!Converting from MySQL to }
331 \index[general]{Converting from MySQL to PostgreSQL }
333 The conversion procedure presented here was worked out by Norm Dressler
334 \lt{}ndressler at dinmar dot com\gt{}
336 This process was tested using the following software versions:
339 \item Linux Mandrake 10/Kernel 2.4.22-10 SMP
340 \item Mysql Ver 12.21 Distrib 4.0.15, for mandrake-linux-gnu (i586)
341 \item PostgreSQL 7.3.4
345 WARNING: Always as a precaution, take a complete backup of your databases
346 before proceeding with this process!
349 \item Shutdown bacula (cd /etc/bacula;./bacula stop)
350 \item Run the following command to dump your Mysql database:
354 mysqldump -f -t -n >bacula-backup.dmp
359 \item Make a backup of your /etc/bacula directory (but leave the original in
361 \item Go to your Bacula source directory and rebuild it to include PostgreSQL
362 support rather then Mysql support. Check the config.log file for your
363 original configure command and replace enable-mysql with enable-postgresql.
364 \item Recompile Bacula with a make and if everything compiles completely,
365 perform a make install.
366 \item Shutdown Mysql.
367 \item Start PostgreSQL on your system.
368 \item Create a bacula user in Postgres with the createuser command. Depending on
369 your Postgres install, you may have to SU to the user who has privileges to
371 \item Verify your pg\_hba.conf file contains sufficient permissions to allow
372 bacula to access the server. Mine has the following since it's on a secure
379 host all all 127.0.0.1 255.255.255.255 trust
381 NOTE: you should restart your postgres server if you
387 \item Change into the /etc/bacula directory and prepare the database and
388 tables with the following commands:
392 ./create_postgresql_database
394 ./make_postgresql_tables
396 ./grant_postgresql_privileges
401 \item Verify you have access to the database:
411 You should not get any errors.
412 \item Load your database from the Mysql database dump with:
416 psql -Ubacula bacula <bacula-backup.dmp>
421 \item Resequence your tables with the following commands:
427 SELECT SETVAL('basefiles_baseid_seq', (SELECT
428 MAX(baseid) FROM basefiles));
429 SELECT SETVAL('client_clientid_seq', (SELECT
430 MAX(clientid) FROM client));
431 SELECT SETVAL('file_fileid_seq', (SELECT MAX(fileid)
433 SELECT SETVAL('filename_filenameid_seq', (SELECT
434 MAX(filenameid) FROM filename));
436 SELECT SETVAL('fileset_filesetid_seq', (SELECT
437 MAX(filesetid) FROM fileset));
439 SELECT SETVAL('job_jobid_seq', (SELECT MAX(jobid) FROM job));
440 SELECT SETVAL('jobmedia_jobmediaid_seq', (SELECT
441 MAX(jobmediaid) FROM jobmedia));
442 SELECT SETVAL('media_mediaid_seq', (SELECT MAX(mediaid) FROM media));
443 SELECT SETVAL('path_pathid_seq', (SELECT MAX(pathid) FROM path));
445 SELECT SETVAL('pool_poolid_seq', (SELECT MAX(poolid) FROM pool));
450 \item At this point, start up Bacula, verify your volume library and perform
451 a test backup to make sure everything is working properly.
454 \section{Upgrading PostgreSQL}
455 \index[general]{Upgrading PostgreSQL }
456 \index[general]{Upgrading!PostgreSQL }
457 \index[general]{Upgrading}
458 If you upgrade PostgreSQL, you must reconfigure, rebuild, and re-install
459 Bacula otherwise you are likely to get bizarre failures. If you
460 to modify the bacula.spec file to account for the new PostgreSQL version.
461 You can do so by rebuilding from the source rpm. To do so, you may need
462 install from rpms and you upgrade PostgreSQL, you must also rebuild Bacula.
464 \section{Tuning PostgreSQL}
465 \index[general]{Tuning}
467 If you despool attributes for many jobs at the same time, you can tune the
468 sequence object for the \texttt{FileId} field.
472 ALTER SEQUENCE file_fileid_seq CACHE 1000;
476 \index[general]{Credits }
477 Many thanks to Dan Langille for writing the PostgreSQL driver. This will
478 surely become the most popular database that Bacula supports.