| 1 | $Id: mysql_drv.txt,v 1.5 2011/06/28 00:13:48 sbajic Exp $ |
|---|
| 2 | |
|---|
| 3 | COPYRIGHT (C) 2002-2012 DSPAM Project |
|---|
| 4 | http://dspam.sourceforge.net |
|---|
| 5 | |
|---|
| 6 | LICENSE |
|---|
| 7 | |
|---|
| 8 | This program is free software: you can redistribute it and/or modify |
|---|
| 9 | it under the terms of the GNU Affero General Public License as |
|---|
| 10 | published by the Free Software Foundation, either version 3 of the |
|---|
| 11 | License, or (at your option) any later version. |
|---|
| 12 | |
|---|
| 13 | This program is distributed in the hope that it will be useful, |
|---|
| 14 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
|---|
| 15 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|---|
| 16 | GNU Affero General Public License for more details. |
|---|
| 17 | |
|---|
| 18 | You should have received a copy of the GNU Affero General Public License |
|---|
| 19 | along with this program. If not, see <http://www.gnu.org/licenses/>. |
|---|
| 20 | |
|---|
| 21 | ABOUT |
|---|
| 22 | |
|---|
| 23 | mysql_drv is a MySQL storage driver for DSPAM v3.0 and above. This driver |
|---|
| 24 | enables DSPAM to read and write all token, signature, and statistics data |
|---|
| 25 | from a MySQL database. The advantages of using a SQL backend are obvious: |
|---|
| 26 | |
|---|
| 27 | - Centralized data storage |
|---|
| 28 | - Structured queries for information |
|---|
| 29 | - No need for context locking mechanisms |
|---|
| 30 | - Replication and other MySQL features |
|---|
| 31 | |
|---|
| 32 | DSPAM support MySQL 5.0 and greater. |
|---|
| 33 | |
|---|
| 34 | 1. CONFIGURING DSPAM |
|---|
| 35 | |
|---|
| 36 | To configure DSPAM to use mysql_drv, use the following arguments while running |
|---|
| 37 | DSPAM's configure: |
|---|
| 38 | |
|---|
| 39 | --with-storage-driver=mysql_drv |
|---|
| 40 | Tells DSPAM to use the mysql_drv driver |
|---|
| 41 | |
|---|
| 42 | --with-mysql-libraries=/path/to/libs |
|---|
| 43 | Tells DSPAM where to find the MySQL client libraries. They are usually |
|---|
| 44 | located in /usr/local/mysql/lib |
|---|
| 45 | |
|---|
| 46 | --with-mysql-includes=/path/to/libs |
|---|
| 47 | Tells DSPAM where to find the MySQL headers. They are usually located in |
|---|
| 48 | /usr/local/mysql/include |
|---|
| 49 | |
|---|
| 50 | --enable-virtual-users |
|---|
| 51 | Tells DSPAM to create virtual user ids for each dspam user. Use this if your |
|---|
| 52 | users don't really exist on the system (e.g. via getpwuid) or if you're doing |
|---|
| 53 | something weird like sharing uids. |
|---|
| 54 | |
|---|
| 55 | After configure has successfully finished, build and install DSPAM using the |
|---|
| 56 | instructions from DSPAM's readme. |
|---|
| 57 | |
|---|
| 58 | 2. CREATING MYSQL OBJECTS |
|---|
| 59 | |
|---|
| 60 | Before mysql_drv will function, you must run the mysql_objects-4.1.sql file |
|---|
| 61 | (located in src/tools.mysql_drv) to create the table objects required by the |
|---|
| 62 | driver. See your MySQL documentation for further information. |
|---|
| 63 | |
|---|
| 64 | This script assumes that you have already created a database for DSPAM objects |
|---|
| 65 | and a user with full access to SELECT, INSERT, UPDATE, and DELETE. |
|---|
| 66 | |
|---|
| 67 | If you plan on enabling virtual users (something you'll need to do if the users |
|---|
| 68 | don't actually exist on your system), also run virtual_users.sql. |
|---|
| 69 | |
|---|
| 70 | You may also wish to add this line to the mysqld portion of /etc/my.cnf: |
|---|
| 71 | |
|---|
| 72 | set-variable = max_allowed_packet=8192000 |
|---|
| 73 | |
|---|
| 74 | This will extend the query size from 1MB to 8MB; some larger queries may |
|---|
| 75 | cause MySQL to drop connection without this set. |
|---|
| 76 | |
|---|
| 77 | NOTE: The mysql_objects-space.sql, mysql_objects-speed.sql and purge,sql files |
|---|
| 78 | located in src/tools.mysql_drv were originally created for older MySQL versions. |
|---|
| 79 | They can be used on recent MySQL versions, but do not use MySQL features for |
|---|
| 80 | improved performance available since MySQL 4.1. For new setups, you should |
|---|
| 81 | always use the *-4.1.sql files. |
|---|
| 82 | |
|---|
| 83 | 3. UPDATING DSPAM.CONF |
|---|
| 84 | |
|---|
| 85 | mysql_drv needs to know how to connect to your MySQL database. You will need to |
|---|
| 86 | specify this information in dspam.conf. This file already contains some example |
|---|
| 87 | data: |
|---|
| 88 | |
|---|
| 89 | MySQLServer /var/lib/mysql/mysql.sock |
|---|
| 90 | MySQLPort |
|---|
| 91 | MySQLUser dspam |
|---|
| 92 | MySQLPass changeme |
|---|
| 93 | MySQLDb dspam |
|---|
| 94 | MySQLCompress true |
|---|
| 95 | MySQLReconnect true |
|---|
| 96 | |
|---|
| 97 | If you are using MySQL >= 5.0.13 and have problems with DSPAM dropping the |
|---|
| 98 | connection to your MySQL instance, then set MySQLReconnect to true to allow |
|---|
| 99 | the mysql_drv to try to re-establish stale and/or dead connections. |
|---|
| 100 | |
|---|
| 101 | Or if you'd like to connect via TCP, use the IP address and port of the |
|---|
| 102 | MySQL server. DSPAM checks to see if the first character of the HOSTNAME field |
|---|
| 103 | is a slash, and if so will treat it like a socket file. |
|---|
| 104 | |
|---|
| 105 | 4. NIGHTLY PURGE |
|---|
| 106 | |
|---|
| 107 | If you would like to purge the many stale tokens DSPAM will have lying around |
|---|
| 108 | the database, you should run one of the provided purge scripts nightly. |
|---|
| 109 | The dspam_clean tool can be configured to perform more granular cleansing, |
|---|
| 110 | such as that of uninteresting data. See DSPAM's README for more information |
|---|
| 111 | about the dspam_clean tool. |
|---|
| 112 | |
|---|
| 113 | If you are supporting TOE or TUM-mode users on your system, you will want to |
|---|
| 114 | do one of the following: |
|---|
| 115 | |
|---|
| 116 | 1. Preferences Extensions |
|---|
| 117 | |
|---|
| 118 | It is recommended you activate preferences extension support. |
|---|
| 119 | purge-4.1.sql will skip certain types of purges for users with TOE/TUM |
|---|
| 120 | specified in their preferences. |
|---|
| 121 | |
|---|
| 122 | NOTE: You should add a preference for any global users on your system, so |
|---|
| 123 | that their data is purged as if TOE-based (since global user data is |
|---|
| 124 | rarely updated). You can do this using: |
|---|
| 125 | |
|---|
| 126 | dspam_admin add pref [username] trainingMode TOE |
|---|
| 127 | |
|---|
| 128 | 2. Global TOE Support |
|---|
| 129 | |
|---|
| 130 | If you are using TOE globally (and not in individual user preferences), |
|---|
| 131 | then you should update purge-4.1.sql, and set the default training mode |
|---|
| 132 | to TOE: |
|---|
| 133 | |
|---|
| 134 | SET @TrainingMode = 'TOE'; |
|---|
| 135 | |
|---|
| 136 | This will prevent the purging of stale tokens, which could cause serious |
|---|
| 137 | data loss in TOE databases (because tokens are never touched unless |
|---|
| 138 | an error has occured). All other purges should be safe even for TOE-mode |
|---|
| 139 | users. |
|---|
| 140 | |
|---|
| 141 | If you will NOT be supporting TOE users on your system, you may simply run |
|---|
| 142 | the purge-4,1.sql script nightly, as-is. |
|---|
| 143 | |
|---|
| 144 | 5. TUNING |
|---|
| 145 | |
|---|
| 146 | If you have a busy server, and find a lot of table locks, you may consider |
|---|
| 147 | making a few tweaks to the MySQL configuration. Alternatively, you may |
|---|
| 148 | consider InnoDB which performs row-level locking, but this is rarely necessary. |
|---|
| 149 | |
|---|
| 150 | Increase key_buffer_size. If you have the memory, try at least 256M or 512M. |
|---|
| 151 | |
|---|
| 152 | Increase table_cache. Try a higher value (some systems go as high as 1024). |
|---|
| 153 | This is related to the max_connections option and allows many file descriptors |
|---|
| 154 | to be shared among threads. |
|---|
| 155 | |
|---|
| 156 | Increase myisam_sort_buffer_size to a higher value, depending on your memory. |
|---|
| 157 | Ideally, a few hundred MB would be great, but at least 64M would be an |
|---|
| 158 | improvement. |
|---|
| 159 | |
|---|
| 160 | 5.1 USING INNODB |
|---|
| 161 | |
|---|
| 162 | On very large tables using InnoDB instead of MyISAM could speedup DSPAM because |
|---|
| 163 | InnoDB uses row-level locking while MyISAM uses table-level locking. The row- |
|---|
| 164 | level locking (used in InnoDB) may be faster because additional updates are not |
|---|
| 165 | waiting for the entire table (used in MyISAM) to unlock. In most cases using |
|---|
| 166 | table-level locking instead of row-level locking is considered to be faster but |
|---|
| 167 | since DSPAM can use many concurrent processes (especially if running in daemon |
|---|
| 168 | mode) where each of the processes maintains his own connection to MySQL, switching |
|---|
| 169 | to row-level locking (as used in InnoDB) could noticeable speedup the processing |
|---|
| 170 | throughput of DSPAM. |
|---|
| 171 | |
|---|
| 172 | To convert all DSPAM tables to use InnoDB engine, execute the following SQL |
|---|
| 173 | commands against your DSPAM database: |
|---|
| 174 | ALTER TABLE `dspam_signature_data` |
|---|
| 175 | ENGINE = InnoDB; |
|---|
| 176 | ALTER TABLE `dspam_stats` |
|---|
| 177 | ENGINE = InnoDB; |
|---|
| 178 | ALTER TABLE `dspam_token_data` |
|---|
| 179 | ENGINE = InnoDB; |
|---|
| 180 | ALTER TABLE `dspam_virtual_uids` |
|---|
| 181 | ENGINE = InnoDB; |
|---|
| 182 | |
|---|
| 183 | If you are using the preference extension then issue the following SQL command |
|---|
| 184 | to convert the preference extension table to InnoDB: |
|---|
| 185 | ALTER TABLE `dspam_preferences` |
|---|
| 186 | ENGINE = InnoDB; |
|---|
| 187 | |
|---|
| 188 | When using InnoDB you can add additional constrains to the DSPAM tables so that |
|---|
| 189 | automatically when you remove a user in DSPAM all his/her tokens, signatures, |
|---|
| 190 | preferences and statistic data get removed as well. |
|---|
| 191 | |
|---|
| 192 | !! IMPORTANT: Do not add those constrains if you are using DSPAM virtual user |
|---|
| 193 | aliases (aka: DSPAM in relay mode) !! |
|---|
| 194 | |
|---|
| 195 | To add the additional constrains execute the following SQL commands against your |
|---|
| 196 | DSPAM database: |
|---|
| 197 | SET FOREIGN_KEY_CHECKS=0; |
|---|
| 198 | ALTER TABLE `dspam_signature_data` |
|---|
| 199 | ADD CONSTRAINT `dspam_signature_data_ibfk_1` |
|---|
| 200 | FOREIGN KEY (`uid`) |
|---|
| 201 | REFERENCES `dspam_virtual_uids` (`uid`) |
|---|
| 202 | ON DELETE CASCADE; |
|---|
| 203 | ALTER TABLE `dspam_stats` |
|---|
| 204 | ADD CONSTRAINT `dspam_stats_ibfk_1` |
|---|
| 205 | FOREIGN KEY (`uid`) |
|---|
| 206 | REFERENCES `dspam_virtual_uids` (`uid`) |
|---|
| 207 | ON DELETE CASCADE; |
|---|
| 208 | ALTER TABLE `dspam_token_data` |
|---|
| 209 | ADD CONSTRAINT `dspam_token_data_ibfk_1` |
|---|
| 210 | FOREIGN KEY (`uid`) |
|---|
| 211 | REFERENCES `dspam_virtual_uids` (`uid`) |
|---|
| 212 | ON DELETE CASCADE; |
|---|
| 213 | SET FOREIGN_KEY_CHECKS=1; |
|---|
| 214 | |
|---|
| 215 | If you are using the preference extension then issue the following SQL |
|---|
| 216 | commands to add the additional constrain to the preference extension table: |
|---|
| 217 | SET FOREIGN_KEY_CHECKS=0; |
|---|
| 218 | ALTER TABLE `dspam_preferences` |
|---|
| 219 | ADD CONSTRAINT `dspam_preferences_ibfk_1` |
|---|
| 220 | FOREIGN KEY (`uid`) |
|---|
| 221 | REFERENCES `dspam_virtual_uids` (`uid`) |
|---|
| 222 | ON DELETE CASCADE; |
|---|
| 223 | SET FOREIGN_KEY_CHECKS=1; |
|---|
| 224 | |
|---|
| 225 | If you have added those constrains and later decide to switch to DSPAM virtual |
|---|
| 226 | user aliases or decide that you don't need/want those constrains then issue the |
|---|
| 227 | following SQL commands against your DSPAM database to remove the constrains: |
|---|
| 228 | SET FOREIGN_KEY_CHECKS=0; |
|---|
| 229 | ALTER TABLE `dspam_signature_data` |
|---|
| 230 | DROP FOREIGN KEY `dspam_signature_data_ibfk_1`; |
|---|
| 231 | ALTER TABLE `dspam_stats` |
|---|
| 232 | DROP FOREIGN KEY `dspam_stats_ibfk_1`; |
|---|
| 233 | ALTER TABLE `dspam_token_data` |
|---|
| 234 | DROP FOREIGN KEY `dspam_token_data_ibfk_1`; |
|---|
| 235 | SET FOREIGN_KEY_CHECKS=1; |
|---|
| 236 | |
|---|
| 237 | If you have enabled the preference extension in DSPAM then do not forget to |
|---|
| 238 | remove the constrain from the dspam_preferences table as well: |
|---|
| 239 | SET FOREIGN_KEY_CHECKS=0; |
|---|
| 240 | ALTER TABLE `dspam_preferences` |
|---|
| 241 | DROP FOREIGN KEY `dspam_preferences_ibfk_1`; |
|---|
| 242 | SET FOREIGN_KEY_CHECKS=1; |
|---|
| 243 | |
|---|
| 244 | 6. REPAIRING |
|---|
| 245 | |
|---|
| 246 | If your database gets corrupt, you'll need to repair it. This could take a |
|---|
| 247 | long time, and so it may make sense to keep a hot backup somewhere. You can |
|---|
| 248 | run a command like this to repair the database: |
|---|
| 249 | |
|---|
| 250 | mysqlcheck --all-databases --fast --auto-repair |
|---|
| 251 | |
|---|
| 252 | ERRORS |
|---|
| 253 | |
|---|
| 254 | Any SQL errors will be reported to LOGDIR/sql.errors as well as the standard |
|---|
| 255 | syslog facilities (although the query will be truncated). |
|---|
| 256 | |
|---|
| 257 | QUESTIONS |
|---|
| 258 | |
|---|
| 259 | Please contact the dspam-dev mailing list with any questions or constructive |
|---|
| 260 | feedback. |
|---|
| 261 | |
|---|
| 262 | Initial storage driver written by Jonathan A. Zdziarski <jonathan@nuclearelephant.com> |
|---|
| 263 | and later enhanced by Stevan Bajic <stevan@bajic.ch> for DSPAM 3.9.0. |
|---|